我有一个嵌套对象数组。这些对象采用以下两种形式之一:
// type a
{
value: 'some value'
}
或
// type b
{
array: [
object of type a or b,
object of type a or b,
...
]
}
因此,基本数组可以无限嵌套。给定一系列索引(我一直将其称为“树”),如何删除任意深度的单个项目?
到目前为止我所拥有的示例:
const baseArray = [
{ value: 'some value' },
{ array: [
{ value: 'some value' },
{ array: [
{ value: 'some value' },
{ value: 'some value' },
],
},
{ value: 'some value' },
{ array: [
{ value: 'some value' },
{ array: [
{ value: 'delete me' },
{ value: 'some value' },
]
},
],
},
],
}
]
const tree = [1, 3, 1, 0]
function deleteNested(tree, inputArray) {
const index = tree.shift();
console.log(inputArray, index);
const child = inputArray[index].array;
if (tree.length > 0) {
console.log(child)
return deleteNested(tree, child);
}
return [
...inputArray.slice(0, index),
...inputArray.slice(index + 1)
]
}
const originalArray = baseArray.slice(0);
console.log(deleteNested(tree, baseArray), originalArray);
我想删除给定“树”位置的标记对象:[1, 3, 1, 0]
:
- 首先,查看初始数组的 1(索引 1,而不是 0)值,
- 然后是 3 值,
- 然后查看 1 值,
- 然后最后删除 0 值。
我上面的内容不起作用,但已经让我开始了。
该函数需要递归才能在任何深度工作。理想情况下,它不应该使用 splice() 来避免修改传递给它的数组 - 相反,它应该返回一个新数组。
最佳答案
正如我在评论中所说,如果您提前知道迭代次数,则不应使用递归方法。 while 循环是理想的选择,例如;
function delNestedItem(a,dm){
var i = 0;
while (i < dm.length-1) a = a[dm[i++]].array;
a.splice(dm[i],1);
}
var data = [
{ value: 'some value' },
{ array: [
{ value: 'some value' },
{ array: [
{ value: 'some value' },
{ value: 'some value' },
],
},
{ value: 'some value' },
{ array: [
{ value: 'some value' },
{ array: [
{ value: 'delete me' },
{ value: 'some value' },
]
},
],
},
],
}
],
delMark = [1, 3, 1, 0];
delNestedItem(data,delMark);
console.log(JSON.stringify(data,null,2));
关于javascript - 通过索引从嵌套数组中删除项目(递归),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39826549/