从递归函数内部的数组中删除对象

时间:2020-06-12 01:46:53

标签: javascript arrays object recursion

我有以下模型对象:

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);
}

2 个答案:

答案 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);

相关问题