我正在尝试根据对象的特定属性是否为null来过滤掉对象数组中的数据点。但是,此数组嵌套在另一个数组中。请参阅下面的示例(我想从'b'数组中删除那些在'c'属性中包含 null 的对象:
var data = [{
a: 1,
b: [{
c: null,
d: 10
}, {
c: 10,
d: 10
}]
}, {
a: 2,
b: [{
c: null,
d: 10
}, {
c: 10,
d: 10
}, {
c: 13,
d: 1
}]
}, {
a: 6,
b: [{
c: null,
d: 10
}, {
c: 10,
d: 10
}, {
c: null,
d: 10
}]
}]
data.forEach(function(d) {
d['b'].filter(function(da) {
return typeof(da['c']) == "number"
})
})
console.log(data)
上面的代码不是从嵌套数组中删除“null”值对象,而是按原样返回整个数组。我在这做错了什么?
更新:我理解了我的错误,并且我已经用答案更新了帖子。感谢所有回复。
答案 0 :(得分:1)
data.forEach((dataPoint) => {
dataPoint.b = dataPoint.b.filter((dataChild) => {
return typeof dataChild.c === 'number'
})
})
您只需将“b”重新分配给新过滤的数组。
答案 1 :(得分:1)
您可以使用reduce
功能
var data = [{
a: 1,
b: [{
c: null,
d: 10
}, {
c: 10,
d: 20
}]
}, {
a: 2,
b: [{
c: null,
d: 10
}, {
c: 30,
d: 40
}, {
c: 13,
d: 1
}]
}, {
a: 6,
b: [{
c: null,
d: 10
}, {
c: 50,
d: 60
}, {
c: null,
d: 10
}]
}];
var result = data.reduce((r,s) => {
r.push(Object.assign({}, s, {b: s.b.filter(v => v.c)}));
return r;
}, []);
console.log(result);

答案 2 :(得分:1)
data = data.map(value => ({...value, b: value.b.filter(innerValue => typeof innerValue.c === 'number')}))
答案 3 :(得分:0)
这对你有用吗?
data.map(item => ({ ...item, b: item.b.filter(itemB => itemB.c)}))
或
data.map(item => ({ a: item.a, b: item.b.filter(itemB => itemB.c)}))
输出:
[
{
"a": 1,
"b": [
{
"c": 10,
"d": 10
}
]
},
{
"a": 2,
"b": [
{
"c": 10,
"d": 10
},
{
"c": 13,
"d": 1
}
]
},
{
"a": 6,
"b": [
{
"c": 10,
"d": 10
}
]
}
]
答案 4 :(得分:0)
非常感谢所有答案。我理解我的错误。我没有将.filter()的返回值赋给任何东西。这是更新后的代码
data1 = [{
a: 1,
b: [{
c: null,
d: 10
}, {
c: 10,
d: 10
}]
}, {
a: 2,
b: [{
c: null,
d: 10
}, {
c: 10,
d: 10
}, {
c: 13,
d: 1
}]
}, {
a: 6,
b: [{
c: null,
d: 10
}, {
c: 10,
d: 10
}, {
c: null,
d: 10
}]
}]
data1.forEach(function(d) {
d['b'] = d['b'].filter(function(da) {
return typeof da['c'] === "number"
})
})
console.log(data1)