![](/img/trans.png)
[英]filter nested array of objects based on object values Javascript ES6
[英]double nested array of object es6 filter
我想过滤出嵌套的对象数组,但卡在过滤器部分。
如何去除其中一个标记?
this.state = {
data: [
{
id: 1,
name: "Main",
subs: [
{
id: "jay",
name: "Jay",
mark: [
{
id: "5a5d84b94a074c49ef2d4553",
name: 100
},
{
id: "5a5d84b94a074119ef2d4553",
name: 70
}
]
}
]
}
]
};
https://codesandbox.io/s/p39momxzp7
我尝试使用es6,因为它更具可读性。
预期产量
data: [
{
id: 1,
name: "Main",
subs: [
{
id: "jay",
name: "Jay",
mark: [
{
id: "5a5d84b94a074119ef2d4553",
name: 70
}
]
}
]
}
]
由于您的数据结构中有多个嵌套数组,因此您需要多次使用forEach
data.forEach( s => //iterate data
s.subs.forEach( t => //iterate subs
( t.mark = t.mark.slice( 1, 2 ) ) ) ); //slice the second value out
演示版
var data = [{ id: 1, name: "Main", subs: [{ id: "jay", name: "Jay", mark: [{ id: "5a5d84b94a074c49ef2d4553", name: 100 }, { id: "5a5d84b94a074119ef2d4553", name: 70 } ] }] }]; data.forEach(s => s.subs.forEach(t => (t.mark = t.mark.slice(1,2)))); console.log(JSON.stringify(data, 0, 4))
如果应该选择最后一个值 ?
data.forEach( s => //iterate data
s.subs.forEach( t => //iterate subs
( t.mark = t.mark.slice( -1 ) ) ) ); //slice the last value out
如果您尝试按给定id
过滤相关mark
,
您可以结合使用Array#map
和Array#filter
来实现它:
请注意,我也在使用“ 对象剩余/扩展属性”提案 (阶段4)
运行示例
const state = { data: [{ id: 1, name: "Main", subs: [{ id: "jay", name: "Jay", mark: [{ id: "5a5d84b94a074c49ef2d4553", name: 100 }, { id: "5a5d84b94a074119ef2d4553", name: 70 }] }] }] }; const mark_id = '5a5d84b94a074119ef2d4553'; const nextState = { ...state, data: state.data.map(obj => { const filteredSubs = obj.subs.map(sub => { const markById = sub.mark.filter(m => m.id === mark_id); return { ...sub, mark: markById } }); return { ...obj, subs: filteredSubs } }) }; console.log(nextState);
您甚至可以使用lodash,其中包含许多可以轻松处理的方法。
检查这是否是您想要的。 (有一个很好的范围可以对其进行重构,但是在此之前,您想了解这是否是您要找的东西)
以下是已在其中使用的代码。
let inputId = "5a5d84b94a074c49ef2d4553";
let filteredData =_.each(_.cloneDeep(data), function(value, key1) {
_.each(value.subs, function(valueSubs, key2) {
var finalSubMark = _.find(valueSubs.mark, function(eachMark) {
return eachMark.id == inputId;
});
_.set(valueSubs, "mark", finalSubMark);
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.