如何使用javascript递归更新嵌套数组

如何使用javascript递归更新嵌套数组,javascript,arrays,recursion,closures,Javascript,Arrays,Recursion,Closures,我有一个数组,其中包含: 名称 id表示数组中的路径,并且 儿童可选。子数组具有与数组相同的结构。 每个元素可能有子元素,其子元素可能有自己的子元素等。 它可能是深度嵌套的数组。 我想根据新索引更新所有嵌套子项的ID。 我有一个接受数组和新索引的函数。如果元素包含子元素,则函数递归调用自身。 例如,我传递一个数组和一个等于1的索引。在这种情况下,我希望将“2.children[0]。children[0]”替换为“1.children[0]。children[0]” 由于某些原因,嵌套子项未正确

我有一个数组,其中包含: 名称 id表示数组中的路径,并且 儿童可选。子数组具有与数组相同的结构。 每个元素可能有子元素,其子元素可能有自己的子元素等。 它可能是深度嵌套的数组。 我想根据新索引更新所有嵌套子项的ID。 我有一个接受数组和新索引的函数。如果元素包含子元素,则函数递归调用自身。 例如,我传递一个数组和一个等于1的索引。在这种情况下,我希望将“2.children[0]。children[0]”替换为“1.children[0]。children[0]”

由于某些原因,嵌套子项未正确更新。当我调试代码时,我看到newValue生成正确,但最后我收到一个带有旧ID的arry

  {
    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}