使用索引数组访问和修改Javascript中任意深的嵌套数组

问题描述 投票:1回答:2

我有一组对象。每个对象还可以包含对象数组,依此类推直至任意深度。

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)

但无法确定如何使用相同的想法删除或添加值。非常感谢您的帮助。

javascript arrays multidimensional-array
2个回答
1
投票

您可以创建一个函数,该函数采用与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

1
投票

最简单的方法是只使用索引而不使用最后一个索引,以便根据需要将其用于任何操作。

对于删除,您需要此索引将数组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
© www.soinside.com 2019 - 2024. All rights reserved.