javascript - 通过索引从嵌套数组中删除项目(递归)

标签 javascript arrays recursion

我有一个嵌套对象数组。这些对象采用以下两种形式之一:

// 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/

相关文章:

javascript - 如何将 Node.js 变量传递到 Pug 脚本标记的内部?

javascript - Uncaught Error : [$injector:unpr] Unknown provider: $animateProvider

javascript - chrome api - 将选项卡移出窗口

javascript - 如何以递归方式将 XML 列表显示为以前的 ASP :MENU did?

C# 使用递归创建分形

recursion - 什么是函数的尾部上下文?

javascript - 在 PhoneGap 2.9 中使用 jQuery/JavaScript 单击按钮事件不执行任何操作

php - SQL插入多行,foreach

python - 计算多个文件的平均值

javascript - 如何比较 Javascript 中的数组和对象?