I have an array which contains: name, id (id represents the path in array) and children (optional). Children has the same structure array has. Each element may have children, and its children may have their own children etc. Potentially it can be deeply nested array. I want to update ids for all nested children depending on new index. I have a function which accepts an array and a new index. The function calls itself recursively if an element contains children. For example, I pass an array and an index equal to 1. In this case I expect'2.children[0].children[0]' to be replaced with'1.children[0].children[0]'
For some reason nested children are not updated correctly. When I debug the code I see that newValue is generated correctly but in the end I receive an arry with old ids.
{
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);
expected result would be:
[
{
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]' },
]
I would appreciate if someone could help me with that