#javascript #arrays
Вопрос:
У меня есть глубоко вложенный массив объектов с определенными свойствами, и, учитывая объект в качестве входных данных, он должен рекурсивно обновлять этот объект вместе с его дочерними элементами. Его формат выглядит следующим образом,
const arr = [
{
name: "parent",
children: [
{
name: "child1",
children: [
{
name: "granchild1",
children: [],
class: "level-2 leaf",
config: {
name: "granchild1",
value1: false,
value2: false
}
}
],
class: "level-1 leaf",
config: {
name: "child1",
value1: false,
value2: false
}
},
{
name: "child2",
children: [],
class: "level-1 leaf",
config: {
name: "child2",
value1: false,
value2: false
}
}
],
class: "level-0 group",
config: {
name: "parent",
value1: false,
value2: false
}
}
];
Данный входной объект будет выглядеть следующим образом
const obj = {
name: "parent",
value1: true,
value2: true
};
Учитывая эти входные данные, объект с соответствующим именем должен обновить свои и дочерние value1
значения и value2
obj's
значения
Вывод должен выглядеть так
const result = [
{
name: "parent",
children: [
{
name: "child1",
children: [
{
name: "granchild1",
children: [],
class: "level-2 leaf",
config: {
name: "granchild1",
value1: true,
value2: true
}
}
],
class: "level-1 leaf",
config: {
name: "child1",
value1: true,
value2: true
}
},
{
name: "child2",
children: [],
class: "level-1 leaf",
config: {
name: "child2",
value1: true,
value2: true
}
}
],
class: "level-0 group",
config: {
name: "parent",
value1: true,
value2: true
}
}
];
Код, который я пробовал. Как мне добиться того же результата
const res = arr.map((item) => {
let foundItem = arr.find((item) => item.name === obj.name);
return {
...foundItem,
children: {
value1: obj.value1,
value2: obj.value2
}
};
});
Ответ №1:
Вам нужна рекурсивная функция, которая передает, был ли нужный родитель найден в одном из его предков.
const arr=[{name:"parent",children:[{name:"child1",children:[{name:"granchild1",children:[],class:"level-2 leaf",config:{name:"granchild1",value1:!1,value2:!1}}],class:"level-1 leaf",config:{name:"child1",value1:!1,value2:!1}},{name:"child2",children:[],class:"level-1 leaf",config:{name:"child2",value1:!1,value2:!1}}],class:"level-0 group",config:{name:"parent",value1:!1,value2:!1}}];
const recurse = (arr, nameToFind, objToMerge, inAncestor = false) => {
return arr.map(obj => {
const mergeThis = inAncestor || obj.name === nameToFind;
const merged = !mergeThis ? obj : { ...obj, config: { ...obj.config, ...objToMerge } };
if (merged.children) {
merged.children = recurse(merged.children, nameToFind, objToMerge, mergeThis);
}
return merged;
});
};
const obj = {
name: "parent",
value1: true,
value2: true
};
const { name, ...objToMerge } = obj;
const result = recurse(arr, name, objToMerge);
console.log(result);
Комментарии:
1. Спасибо, работает как заклинание