如何从嵌套数组中筛选出对象

时间:2019-04-03 17:16:26

标签: javascript arrays

我尝试从匹配属性值(titleB2)的数组中筛选出孔对象(objB)。

const array = [
  {
    name: 'objA',
    subArray: []
  }, {
    name: 'objB',
    subArray: [
      {
        title: 'titleB'
      }, {
        title: 'titleB2'
      }, {
        title: 'titleB3'
      }
    ]
  }, {
    name: 'objC',
    subArray: [
      {
        title: 'titleC'
      }, {
        title: 'titleC2'
      }, {
        title: 'titleC3'
      }
    ]
  }, {
    name: 'objD',
    subArray: []
  }
]

const filterArray = array.filter(a => a.subArray.length > 0);
console.log(filterArray);
// Output: objB + objC

const resArray = filterArray.filter(a => a.subArray.filter(f => f.title === 'titleB2'));
console.log(resArray);
// Output: objB + objC

我想,我在逻辑上做错了。但是到底是什么?

我需要输出

{
  name: 'objB',
  subArray: [
    {
      title: 'titleB'
    }, {
      title: 'titleB2'
    }, {
      title: 'titleB3'
    }
  ]
}

我可以想象我错误地使用了过滤器filterArray.filter(),因为它已经被过滤了吗?但是我这样做是因为在一个数组中有多个数组。好吧,说实话,我不确定。

但是我不明白的是,为什么我可以使用条件a => a.subArray.length > 0?而不是f => f.title === 'titleB2'

2 个答案:

答案 0 :(得分:1)

要在子数组中查找具有特定标题的对象,可以在子数组上使用some(),如果子数组中的一项符合您的条件(在本例中为标题),则返回true: >

const array = [{name: 'objA',subArray: []}, {name: 'objB',subArray: [{title: 'titleB'}, {title: 'titleB2'}, {title: 'titleB3'}]}, {name: 'objC',subArray: [{title: 'titleC'}, {title: 'titleC2'}, {title: 'titleC3'}]}, {name: 'objD',subArray: []}]

let found = array.filter(item => item.subArray.some(sub => sub.title === 'titleB2'))
console.log(found)

答案 1 :(得分:0)

在子数组上使用some()代替filter()。它返回一个布尔值。

const resArray = array.filter(a => a.subArray.some(f => f.title === 'titleB2'));
console.log(resArray);
// Output: objB + objC
<script>

const array = [
  {
    name: 'objA',
    subArray: []
  }, {
    name: 'objB',
    subArray: [
      {
        title: 'titleB'
      }, {
        title: 'titleB2'
      }, {
        title: 'titleB3'
      }
    ]
  }, {
    name: 'objC',
    subArray: [
      {
        title: 'titleC'
      }, {
        title: 'titleC2'
      }, {
        title: 'titleC3'
      }
    ]
  }, {
    name: 'objD',
    subArray: []
  }
]
</script>