假设我有此列表
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}, ]
}
]
答案 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)