过滤列表中的列表并保留结构

时间:2019-05-22 14:48:56

标签: javascript

假设我有此列表

const foo = [
  {
    id: 1,
    bar: [ {id: 1, a: null}, {id: 2, a: 224}, {id: 3, a: 345}, ]
  },
  {
    id: 2,
    bar: [ {id: 4, a: 763}, {id: 5, a: null}, {id: 3, a: 111}, ]
  }
]

如何过滤列表,删除所有a: null,但列表的结构保持不变?

我尝试过

foo.map(elem => elem.bar.filter(bar => bar.a !== null))

但这给了我。

foo = [
    [{id: 2, a: 224}, {id: 3, a: 345}, ],
    [ {id: 4, a: 763}, {id: 3, a: 111}, ]
]

我希望输出为

foo = [
  {
    id: 1,
    bar: [ {id: 2, a: 224}, {id: 3, a: 345}, ]
  },
  {
    id: 2,
    bar: [ {id: 4, a: 763}, {id: 3, a: 111}, ]
  }
]

4 个答案:

答案 0 :(得分:4)

如果可以对数组进行变异,则可以使用过滤的对象更新bar

const foo = [{id:1,bar:[{id:1,a:null},{id:2,a:224},{id:3,a:345},]},{id:2,bar:[{id:4,a:763},{id:5,a:null},{id:3,a:111},]}]

foo.forEach(o => o.bar = o.bar.filter(obj => obj.a !== null))

console.log(foo)

如果您想要一个新数组,则可以使用map

const foo = [{id:1,bar:[{id:1,a:null},{id:2,a:224},{id:3,a:345},]},{id:2,bar:[{id:4,a:763},{id:5,a:null},{id:3,a:111},]}]

const newArray = foo.map(o => ({ ...o, bar: o.bar.filter(obj => obj.a !== null) }))

console.log(newArray)

答案 1 :(得分:1)

由于您实际上只过滤内部数组,因此您想对外部数组使用map

const original = [
  {
    id: 1,
    bar: [ {id: 1, a: null}, {id: 2, a: 224}, {id: 3, a: 345}, ]
  },
  {
    id: 2,
    bar: [ {id: 4, a: 763}, {id: 5, a: null}, {id: 3, a: 111}, ]
  }
]

const result = original.map(elem => ({...elem, bar: elem.bar.filter(bar => bar.a !== null)}));

console.log(`result: ${JSON.stringify(result, null, 2)}`);


// Note: original array unchanged
console.log(`original (unchanged): ${JSON.stringify(original, null, 2)}`);

答案 2 :(得分:1)

首先使用.forEach()访问彼此的对象之后,您可以使用过滤器

const foo = [
  {
    id: 1,
    bar: [ {id: 1, a: null}, {id: 2, a: 224}, {id: 3, a: 345}, ]
  },
  {
    id: 2,
    bar: [ {id: 4, a: 763}, {id: 5, a: null}, {id: 3, a: 111}, ]
  }
]

foo.forEach(obj => obj.bar = obj.bar.filter(subObj => subObj.a != null))

console.log(foo)

如果您不想改变数组,则可以使用JSON.parse(JSON.stringify(obj))来克隆它:

var foo = [
  {
    id: 1,
    bar: [ {id: 1, a: null}, {id: 2, a: 224}, {id: 3, a: 345}, ]
  },
  {
    id: 2,
    bar: [ {id: 4, a: 763}, {id: 5, a: null}, {id: 3, a: 111}, ]
  }
]
var newFoo = JSON.parse(JSON.stringify(foo))
newFoo.forEach(obj => obj.bar = obj.bar.filter(subObj => subObj.a != null))

console.log('Original:\n', foo)
console.log('New Array:\n', newFoo)

答案 3 :(得分:0)

外部方法应为map(),而不是filter()

const foo = [
  {
    id: 1,
    bar: [ {id: 1, a: null}, {id: 2, a: 224}, {id: 3, a: 345}, ]
  },
  {
    id: 2,
    bar: [ {id: 4, a: 763}, {id: 5, a: null}, {id: 3, a: 111}, ]
  }
]

const res = foo.map(elem => ({...elem,bar:elem.bar.filter(bar => bar.a !== null)}))
console.log(res)