如何利用索引数组向嵌套对象数组添加元素(弃用eval)
动态定位嵌套数组对象节点并添加元素(弃用eval)
问题场景
现有一个可能包含嵌套items数组的对象数组TreeItems,以及一个索引数组indexes。需要通过索引数组定位到TreeItems中的指定节点,若该节点已有items嵌套数组则直接追加元素,若没有则先创建items数组再添加元素。核心要求是**不能使用eval**实现动态索引定位(比如示例中要定位TreeItems[4][0][0]的位置)。
解决方案:循环逐层定位节点
通过循环遍历索引数组,逐层深入到目标节点,再处理items数组即可,完全无需eval。
代码示例
// 示例TreeItems结构 const TreeItems = [ { name: '节点1' }, { name: '节点2', items: [{ name: '子节点2-1' }] }, { name: '节点3' }, { name: '节点4' }, { name: '节点5', items: [ { name: '子节点5-1', items: [ { name: '子节点5-1-1' } // 目标节点:对应索引[4,0,0] ]} ]} ]; // 目标节点的索引数组 const indexes = [4, 0, 0]; // 要添加的新元素 const newItem = { name: '新增子节点5-1-1-1' }; // 逐层定位目标节点 let currentNode = TreeItems; for (const idx of indexes) { currentNode = currentNode[idx]; // 可选:处理索引指向不存在节点的情况 if (!currentNode) { console.error('索引数组指向的节点不存在'); break; } } // 给目标节点添加元素 if (currentNode) { if (Array.isArray(currentNode.items)) { // 已有items数组,直接追加 currentNode.items.push(newItem); } else { // 无items数组,初始化后添加 currentNode.items = [newItem]; } }
代码说明
- 逐层定位:用
currentNode变量从TreeItems开始,遍历索引数组的每一项,每次将currentNode更新为当前层级对应索引的节点,直到到达目标位置。 - 异常处理:可以根据业务需求添加节点不存在的处理逻辑(比如报错、创建空节点等)。
- 元素添加:定位到目标节点后,判断是否存在
items数组,存在则追加,不存在则创建新数组并添加元素。
这种方法避免了eval带来的安全风险和性能损耗,逻辑清晰且易于维护。
内容的提问来源于stack exchange,提问作者bbasmer
相关产品推荐
相关产品推荐

