删除嵌套数组中的元素

时间:2018-02-07 06:32:48

标签: javascript

我的JavaScript中有这个结构:

"treeData": [
  {
    "id": 29,
    "name": "Root",
    "children": [
      {
        "id": 30,
        "name": "Sub-Root",
        "children": [
          {
            "id": 31,
            "name": "Sub-Sub-Root"
          }
        ]
      }
    ]
  },
  {
    "id": 32,
    "name": "Root 2"
  }
]

我想删除例如ID为30的对象(所以«Sub-Root»及其子项«Sub-Sub-Root»)。

目前,我正在使用这种递归方法:

for (let i = 0; i < this.treeData.length; i++) {
    this.findNested(this.treeData[i], this.selected.id); // ID is string like «30»
}

 findNested = function (obj, value) {
    if (obj.id === value) {
        // delete not working
        //delete obj;
        obj = null; // Setting to null to delete
        console.log('Passed');
    }
    if (obj && obj.children && obj.children.length > 0) {
        for (let j = 0; j < obj.children.length; j++) {
            this.findNested(obj.children[j], value);
        }
    }
}

问题是,即使我将obj设置为null,我的treeData对象也不会受到影响,我不明白为什么。

我的问题是:如何从我的treeData中删除和元素(及其所有子元素)只知道“id”元素的值?

3 个答案:

答案 0 :(得分:2)

我已经更改了你的代码,你必须跟踪父数组并使用Array.prototype.splice()删除,看看下面,

for (let i = 0; i < this.treeData.length; i++) {
    this.findNested(this.treeData[i], this.treeData, this.selected.id, i); // ID is string like «30»
}

findNested = function (obj, parent, value, i) {
    if (obj.id === value) {
        parent.splice(i,1)
    }
    if (obj && obj.children && obj.children.length > 0) {
        for (let j = 0; j < obj.children.length; j++) {
            this.findNested(obj.children[j], obj.children, value, j);
        }
    }
}

答案 1 :(得分:1)

objfindNested中按价值而非参考传递,因此您在函数中使用obj所做的一切都不会影响this.treeData

答案 2 :(得分:1)

在for-iteration中使用Array.prototype.splice()进行删除。如果找到了您要查找的匹配项,请使findNested函数仅返回信息。

for (let i = 0; i < treeData.length; i++) {
    if (findNested(treeData[i], selected.id)) {
        treeData.splice(i, 1);
    }
}

function findNested (obj, value) {
    let found = false;
    if (obj.id === value) {
        found = true        
    } else {
        if (obj && obj.children && obj.children.length > 0) {
            for (let j = 0; j < obj.children.length; j++) {
                findNested(obj.children[j], value);
            }
        }
    }
    return found;
}