如何根据内部数组的值过滤2D数组

时间:2019-08-19 09:43:41

标签: javascript

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

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

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

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()
        })
      })

我想发生的是,仅显示类型==='视频'的项目。因此数据将变为

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

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

    ],
    "internal_batch_id": 72
  }

2 个答案:

答案 0 :(得分:-1)

我不确定您的预期成绩应该是多少。要么,您要使用带过滤器的地图:

  

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

-v /path/to/postgresql-persistence:/bitnami/postgresql

或者您正在寻找将过滤器用于某些用途:

  

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

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')))

答案 1 :(得分:-1)

您需要执行2个操作,

  • 使用至少包含1个video元素的所有对象过滤父列表
  • 更新以上对象,使其内部仅包含video个对象。

为此,您可以使用.reduce + .filter

  • .reduce创建新对象并创建数组
  • .filter以仅获取其中已过滤的项目。

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.reduce((acc, obj) => {
  const innerObj = obj.data.filter((typeObj) => typeObj.type === type);
  if(innerObj.length !== 0) {
    acc.push( { ...obj, data: innerObj} );
  }
  return acc;
}, [])

console.log(filteredData)