我有以下模型对象:
const model = {
_id: '1',
children: [
{
id: '2',
isCriteria: true
},
{
id: '3',
isCriteria: true
}
]
}
PS:孩子的深度未知,因此我必须使用递归函数进行导航。
我想根据ID数组从子数组中删除特定对象。
因此,例如,如果进行以下调用removeCriteria(model, ['2'])
,则结果应为:
const model = {
_id: '1',
children: [
{
id: '2',
isCriteria: true
}
]
}
我实现了以下功能:
function removeCriteria(node, criteria, parent = []) {
if (node.isCriteria) {
if (criteria.length && !criteria.includes(node.id)) {
parent = parent.filter(criteria => criteria.id !== node.id);
}
console.log(parent) // here the parents object is correct but it doesn't modify the original object
}
if (node.children)
for (const child of node.children) removeCriteria(child, criteria, node.children);
}
答案 0 :(得分:1)
问题是您要重新分配变量parent
,该变量无法完成任何操作,因为您没有对数组进行突变以删除对象,而是将其分配给了新创建的数组。我建议对parentObj
所属的对象引入一个parent
引用,这样就可以将parentObj.children
设置为parent
并实际改变原始对象的array属性:>
const model = {
_id: '1',
children: [
{
id: '2',
isCriteria: true
},
{
id: '3',
isCriteria: true
}
]
};
function removeCriteria(node, criteria, parent = [], parentObj = {}) {
if (node.isCriteria) {
if (criteria.length && !criteria.includes(node.id)) {
parent = parent.filter(criteria => criteria.id !== node.id);
parentObj.children = parent;
}
console.log('parent', parent) // here the parents object is correct but it doesn't modify the original object
}
if (node.children)
for (const child of node.children) removeCriteria(child, criteria, node.children, node);
}
removeCriteria(model, ['2']);
console.log(model);
答案 1 :(得分:1)
分配给parent
不会分配给值来自的对象属性。
您需要过滤node.children
并分配回该属性。
function removeCriteria(node, criteria) {
if (criteria.length == 0) {
return;
}
if (node.children) {
node.children = node.children.filter(child => !child.isCriteria || criteria.includes(child.id));
node.children.forEach(child => removeCriteria(child, criteria));
}
}
const model = {
_id: '1',
children: [{
id: '2',
isCriteria: true
},
{
id: '3',
isCriteria: true
}
]
}
removeCriteria(model, ['2']);
console.log(model);