如何使用javascript递归更新嵌套数组
我有一个数组,其中包含: 名称 id表示数组中的路径,并且 儿童可选。子数组具有与数组相同的结构。 每个元素可能有子元素,其子元素可能有自己的子元素等。 它可能是深度嵌套的数组。 我想根据新索引更新所有嵌套子项的ID。 我有一个接受数组和新索引的函数。如果元素包含子元素,则函数递归调用自身。 例如,我传递一个数组和一个等于1的索引。在这种情况下,我希望将“2.children[0]。children[0]”替换为“1.children[0]。children[0]” 由于某些原因,嵌套子项未正确更新。当我调试代码时,我看到newValue生成正确,但最后我收到一个带有旧ID的arry如何使用javascript递归更新嵌套数组,javascript,arrays,recursion,closures,Javascript,Arrays,Recursion,Closures,我有一个数组,其中包含: 名称 id表示数组中的路径,并且 儿童可选。子数组具有与数组相同的结构。 每个元素可能有子元素,其子元素可能有自己的子元素等。 它可能是深度嵌套的数组。 我想根据新索引更新所有嵌套子项的ID。 我有一个接受数组和新索引的函数。如果元素包含子元素,则函数递归调用自身。 例如,我传递一个数组和一个等于1的索引。在这种情况下,我希望将“2.children[0]。children[0]”替换为“1.children[0]。children[0]” 由于某些原因,嵌套子项未正确
{
name: 'Cat',
id: '0',
},
{
name: 'Dog',
id: '1',
},
{
name: 'Rabbit',
id: '2',
children: [
{
name: 'Little Rabbit Child',
id: '2.children[0]',
children: [
{ name: 'Little Rabbit Child One', id: '2.children[0].children[0]',children: [{ name: "Rat", id: "2.children[0].children[0].children[0]"}] },
{ name: 'Little Rabbit Child Two', id: '2.children[0].children[1]' },
{ name: 'Little Rabbit Child Three', id: '2.children[0].children[2]' },
],
},
{ name: 'Little Rabbit Son', id: '2.children[1]' },
{ name: 'Little Rabbit Daughter', id: '2.children[2]' },
],
},
{
name: 'Elephant',
id: '3',
children: [{ name: 'Little Elephant', id: '3.children[0]' }],
},
];
const updateChildrenIds = (childrenData = [], index) => {
const newData = childrenData.map(value => {
const { id, children = [] } = value;
if (children.length) updateChildrenIds(children, index);
const splitIds = id.split('.');
splitIds[0] = index;
const newId = splitIds.join('.');
const newValue = {...value, id: newId}
return newValue;
});
return newData;
};
const data = updateChildrenIds(testData[2].children, 1);
预期结果将是:
[
{
name: 'Little Rabbit Child',
id: '1.children[0]',
children: [
{ name: 'Little Rabbit Child One', id: '1.children[0].children[0]',children: [{ name: "Rat", id: "1.children[0].children[0].children[0]"}] },
{ name: 'Little Rabbit Child Two', id: '1.children[0].children[1]' },
{ name: 'Little Rabbit Child Three', id: '1.children[0].children[2]' },
],
},
{ name: 'Little Rabbit Son', id: '1.children[1]' },
{ name: 'Little Rabbit Daughter', id: '1.children[2]' },
]
如果有人能在您返回值时帮助我,我将不胜感激
return Object.assign({}, newData)
或
代码中的问题是,在调用UpdateChildrenChildrenChildren、index时,对结果不做任何处理 这段代码创建了一个新的数组,并且不会就地修改旧对象。我衷心赞成这一点!但这意味着,当你在孩子们身上调用updateChildren时,你真的需要对结果做点什么 下面是对代码的一个调整,可以解决这个问题 const updateChildrenIds=childrenData=[],index=>{ const newData=childrenData.mapvalue=>{ const{id,children}=value;//子项没有默认值 //从这里删除了递归调用 const splitIds=id.split'; splitIds[0]=索引; const newId=splitIds.join'; const newValue={…value,id:newId} 如果孩子们{//搬到这里 newValue.children=updateChildrenIdschildren,索引 } 返回新值; }; 返回新数据; }; const testData=[{name:Cat,id:0},{name:Dog,id:1},{name:Rabbit,id:2,children:[{name:Little Rabbit Child,id:2.children[0],children:[{name:Rat,id:2.children[0],children:[{name:Rat,id:2.children[0]},{name:Little Rabbit children-children-2,id:2.children[0],children[1]},{name:Little Rabbit Child Three,id:2.儿童[0].儿童[2]}},{name:Little Rabbit Son,id:2.儿童[1]},{name:Little Rabbit Child,id:2.儿童[2]}},{name:Elephant,id:3.儿童:[{name:Little Elephant,id:3.儿童[0]}] console.log updateChildrenIds testData[2]。子项,1
.作为控制台包装器{min height:100%!important;top:0}pou需要更新还是将该项从结构中删除?相同id的相同项会发生什么情况?我希望通过替换点之前的第一个数字来更新所有子项的id。这很有效。非常感谢!非常感谢您的帮助。
return {...newData}