我有一组对象。每个对象还可以包含对象数组,依此类推直至任意深度。
var myArray = [
{
id:'foo',
items:[]
},
{
id:'bar',
items:[
{
id:'blah'
items:[...etc...]
}
]
}
]
我想使用索引数组读取,添加和删除嵌套数组中的对象。
因此将使用此索引数组作为参数调用从myArray[1][3][2]
中删除值myArray
的函数:[1, 3, 2]
我发现您可以使用reduce()
返回这样的值:
indices.reduce((acc, cur) => Array.isArray(acc) ? acc[cur] : acc.items[cur], myArray)
但无法确定如何使用相同的想法删除或添加值。非常感谢您的帮助。
您可以创建一个函数,该函数采用与splice
函数相似的参数。传递嵌套数组,splice
路径,要删除的项目总数,并使用indices
收集最后要添加的所有新项目。
rest parameters
function deepSplice(array, indices, deleteCount, ...toBeInserted) {
const last = indices.pop();
const finalItems = indices.reduce((acc, i) => acc[i].items, array);
finalItems.splice(last, deleteCount, ...toBeInserted);
return array
}
数组中删除最后一个索引。 indices
数组reduce
在每个循环中获取嵌套的indices
数组,以获取要对其执行插入/删除操作的最终items
数组。 items
索引上的splice
进行插入/删除。如果只想插入,则传递last
。如果您只想删除,请跳过最后一个参数。
以下是代码段:
deleteCount = 0
最简单的方法是只使用索引而不使用最后一个索引,以便根据需要将其用于任何操作。
对于删除,您需要此索引将数组const myArray = [
{ id: "0", items: [] },
{
id: "1",
items: [
{
id: "1.0",
items: [
{ id: "1.0.0", items: [] },
{ id: "1.0.1", items: [] }]
},
{ id: "1.1", items: [] }
]
}
];
function deepSplice(array, indices, deleteCount, ...toBeInserted) {
const last = indices.pop();
const finalItems = indices.reduce((acc, i) => acc[i].items, array);
finalItems.splice(last, deleteCount, ...toBeInserted);
return array
}
console.log(
// removes "1.0.1" item and inserts a new object there
deepSplice(myArray, [1,0,1], 1, { id: 'newlyInserted'})
)
以及更新。
在这种情况下,您可以返回父对象,并使用具有splice
作为给定数组属性的对象作为减少的起始值。
这将允许访问父对象并将items
用于任何进一步的操作。
items