我的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”元素的值?
答案 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)
obj
在findNested
中按价值而非参考传递,因此您在函数中使用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;
}