首页 > 解决方案 > 如何根据内部数组的值过滤二维数组

问题描述

我有一个二维数组,需要根据内部数组的数据进行过滤

我尝试映射然后过滤内部数组的数据 - 但后来我丢失了第一个数组中的数据。

我在下面编写了一个过滤器函数,但它不能正常工作 - 查看过滤数据变量

var data = 
[
  {
    "batch_id": "1",
    "data": [
      {

        "identifier": "aa",
        "type": "video"
      },
      {

        "identifier": "ab",
        "type": "image"
      }
    ],
    "internal_batch_id": 72
  },
  {
    "batch_id": "2",
    "data": [
      {

        "identifier": "a",
        "type": "image"
      },
      {

        "identifier": "b",
        "type": "image"
      }
    ],
    "internal_batch_id": 72
  }
]

var type = 'video'

   var  filteredData =
      data.map((item, i) => {
        return item.data.filter((item1, idx) => {
          return item1.type.toUpperCase() === type.toUpperCase()
        })
      })

我想要发生的是只显示 type === 'video' 的项目。所以数据会变成

{
    "batch_id": "1",
    "data": [
      {

        "identifier": "aa",
        "type": "video"
      }

    ],
    "internal_batch_id": 72
  }

标签: javascript

解决方案


我不确定您的预期输出应该是什么。要么,您正在寻找使用带有过滤器的地图:

按每个类型属性过滤嵌套数据道具

var data = [
  {
    batch_id: '1',
    data: [{ identifier: 'aa', type: 'video' }, { identifier: 'ab', type: 'image' }],
    internal_batch_id: 72
  },
  {
    batch_id: '2',
    data: [{ identifier: 'a', type: 'image' }, { identifier: 'b', type: 'image' }],
    internal_batch_id: 72
  }
]

console.log(data.map(o => ({...o, data:o.data.filter(v => v.type === 'video')})))

或者您正在寻找使用过滤器的一些:

将整个数据对象过滤为具有“视频”类型的对象

var data = [
  {
    batch_id: '1',
    data: [{ identifier: 'aa', type: 'video' }, { identifier: 'ab', type: 'image' }],
    internal_batch_id: 72
  },
  {
    batch_id: '2',
    data: [{ identifier: 'a', type: 'image' }, { identifier: 'b', type: 'image' }],
    internal_batch_id: 72
  }
]

console.log(data.filter(o => o.data.some(v => v.type === 'video')))

或两者:

过滤整个数据对象,并过滤嵌套数据。

var data = [
  {
    batch_id: '1',
    data: [{ identifier: 'aa', type: 'video' }, { identifier: 'ab', type: 'image' }],
    internal_batch_id: 72
  },
  {
    batch_id: '2',
    data: [{ identifier: 'a', type: 'image' }, { identifier: 'b', type: 'image' }],
    internal_batch_id: 72
  }
]

console.log(
  data.reduce((a, o) => {
    const f = o.data.filter(v => v.type === 'video')
    return (f.length && a.push({ ...o, data: f }), a)
  }, [])
)


推荐阅读