【发布时间】:2020-05-04 20:14:13
【问题描述】:
我想复制一个数组以免修改原始数组,并从新数组中删除所有 selected: false ,并返回这个新数组。该数组是无限嵌套的,并且具有不可预测的无限属性名称,因此这应该可以通过迭代查看 Array.isArray() 的每个属性的值来实现。虽然我可以在迭代中删除 selected:false 对象,但我无法将修改后的数组返回到新数组。
函数无法过滤外星人。此外,函数在 in CodePen 中有效,但在我的代码中无效。
// sample nested data
var data = [
{
partyId: "animal-ID-001",
selected: false,
members: [
{
selected: false,
userId: "animal-user-3443"
},
{
selected: false,
userId: "animal-user-3444"
}
]
},
{
partyId: "benjamin-ID-002",
selected: true,
members: [
{
selected: true,
userId: "benjamin-user-5567",
teams: [
{
selected: true,
teamId: "team-benjamin-678"
},
{
selected: false,
teamId: "team-benjamin-3468"
}
]},
{
selected: false,
userId: "benjamin-user-55671"
}
]
},
{
partyId: "crystal-ID-003",
selected: true,
members: [
{
selected: true,
userId: "crystal-user-8567"
},
{
selected: true,
userId: "crystal-user-85671"
}
],
aliens: [
{
selected: false,
alienId: "crystal-alien-467"
},
{
selected: false,
alienId: "crystal-alien-230"
}
]
}
];
// remove selected false from array
// updated per suggestions
function updateState(arr) {
return arr.filter(obj => obj.selected ).map( obj => {
for (var prop in obj) {
if( Array.isArray( obj[prop] ) ) {
return { ...obj, [prop]: updateState( obj[prop] ) };
}
}
return { ...obj }
});
}
console.log( updateState( data ) );
【问题讨论】:
-
updateState( obj[prop] )是做什么的? -
var arr = [...originalArr];是浅拷贝。使用lodash它有deepClone功能,但如果你坚持不使用外部库,你也可以这样做:arr = JSON.parse(JSON.stringify(data))但请务必先阅读:medium.com/@pmzubar/…
标签: javascript arrays recursion nested