Обновите глубоко вложенный массив объектов на основе объекта : Javascript

#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. Спасибо, работает как заклинание