Как обновить соответствующий элемент с глубиной больше первого? - PullRequest
2 голосов
/ 17 апреля 2020

В этом примере есть веская причина для обновления объекта. Но есть одна проблема, это работает только на объектах одного уровня (глубины).

Как я могу сделать то же самое, но с большим количеством первого уровня, глубины?

У меня есть пример объекта здесь:

let globalObj = [
    {
      fam_id: 1, // Random unique ID's.
      name: "No name",
      attributes: {
        "Key2": "*",
        "Key3": "*",
      },
      children: [
        {
          fam_id: 2, // Random unique ID's.
          name: "No name 2",
          attributes: {
            "Key2": "*",
            "Key3": "*",
          },
        },
      ],
    },
  ]

У меня есть объект для обновления global, например:

let updateObj = {        
        fam_id: 2, // Mathed ID!
        name: "No name 3",
        attributes: {
            "Key2": "*",
            "Key3": "*",
         },
},

findIndex и slice методы работают очень хорошо, но для глубины 0? Как отфильтровать больше глубины 0? Как насчет 1 или более?

Спасибо! о /

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете сделать это sh с помощью рекурсивной функции

let globalObj = [
    {
      fam_id: 1, // Random unique ID's.
      name: "No name",
      attributes: {
        "Key2": "*",
        "Key3": "*",
      },
      children: [
        {
          fam_id: 2, // Random unique ID's.
          name: "No name 2",
          attributes: {
            "Key2": "*",
            "Key3": "*",
          },
        },
      ],
    },
  ];

let updateObj = {        
        fam_id: 2, // Mathed ID!
        name: "No name 3",
        attributes: {
            "Key2": "*",
            "Key3": "*",
         },
};

// recursive function
matchAndUpdate = (updater, target) => {
    if (updater.fam_id === target.fam_id) {
        target.name = updater.name;
        target.attributes = updater.attributes;
    }
    
    if ("children" in target && Array.isArray(target.children)) {
        target.children.forEach(child => {
            matchAndUpdate(updater, child);
        });
    }
}

globalObj.forEach(g => {matchAndUpdate(updateObj,g )});

document.getElementById('x').innerText = JSON.stringify(globalObj,null,"\t");
pre {
  background-color: #456;
  color: #FED;
  font-size: small;
}
<pre><code id="x">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...