Как добавить ключ во вложенный массив объектов на основе другого объекта - PullRequest
0 голосов
/ 13 января 2020

У меня есть массив объектов с именем results, и у меня есть Object, ключ которого является ключевым значением объекта editKeyValues, и значение необходимо добавить в ключ редактирования. Ниже приведен Ввод

var result =  [{
  name  :  'database',
  checked : true,
  key :  1,
  schemas  : [
    {
      name  : "schema2",
      checked : true,
      key : 6,
      tables : [
        {
          name  : "table2",
          checked : true,
          key : 7,
          columns : [
            {
              name  : "column1",
              checked : true,
              key : 8,
            }
          ]
        },
      ]
    },

  ]
}]

var editKeyValues = { 8 : "column4", 6 : "schema4"}

Вывод, который я хочу получить в следующем формате:

    var result =  [{
      name  :  'database',
      checked : true,
      key :  1,
      schemas  : [
{
  name  : "schema2",
  checked : true,
  key : 6,
  edit : "schema4"
  tables : [
    {
      name  : "table2",
      checked : true,
      key : 7,
      columns : [
        {
          name  : "column1",
          checked : true,
          key : 8,
          edit : "column4"     // value of key 8 from editkeyValues array
        }
      ]
    },
  ]
},]}]

Предоставьте мне лучший подход, поскольку в результатах имеется большой объем данных. Объект ... Является ли рекурсия хорошая идея ??? Помогите мне найти лучший подход.

Ответы [ 2 ]

0 голосов
/ 13 января 2020

let data = [{
  name: 'database',
  checked: true,
  key: 1,
  schemas: [
    {
      name: "schema2",
      checked: true,
      key: 6,
      tables: [
        {
          name: "table2",
          checked: true,
          key: 7,
          columns: [
            {
              name: "column1",
              checked: true,
              key: 8,
            }
          ]
        },
      ]
    },
  ]
}];
let schemas = data.flatMap(d => d.schemas);
let tables = schemas.flatMap(s => s.tables);
let columns = tables.flatMap(t => t.columns);
let flatData = [data, schemas, tables, columns].flat();

let editKeyValues = {8: "column4", 6: "schema4"};
Object.entries(editKeyValues).forEach(([key, newName]) =>
    flatData.find(obj => obj.key === parseInt(key)).edit = newName);

console.log(data);
0 голосов
/ 13 января 2020

Вы можете взять Map и повторить объекты и выполнить поиск для вложенного массива.

В этом подходе используется короткое замыкание, если больше нет узлов, подходящих для обновления.

function update(array, nodes) {
    return array.some(o => {
        var key = o.key.toString();
        if (nodes.has(key)) {
            o.edit = nodes.get(key);
            nodes.delete(key);
            if (!nodes.size) return true;
        }
        return update(Object.values(o).find(Array.isArray) || [], nodes);
    });
}

var data = [{ name: 'database', checked: true, key: 1, schemas: [{ name: "schema1", checked: true, key: 2, tables: [{ name: "table1", checked: true, key: 3, columns: [{ name: "column2", checked: true, key: 5 }] }] }, { name: "schema2", checked: true, key: 6, tables: [{ name: "table2", checked: true, key: 7, columns: [{ name: "column1", checked: true, key: 8 }] }] }] }],
    keyValues = { 8: 'column4', 6: 'schema4' };

update(data, new Map(Object.entries(keyValues)));

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...