Клубы обоих сложных объектов не работают: Javascript - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть исходный объект, имеющий следующую структуру

var obj1 = {
          type: "type1",
          nested: {
                level1: [
                  { field: "field1", value: "val1"},
                  { field: "field2", value: "val2"},
                  {
                     level2: [
                                  {
                                    field: "abc",
                                    value: "11",
                                  },
                                  {
                                    field: "abc",
                                    value: "12",
                                  }
                             ]
                  }
                ]
          },
          in: 0,
          out: 20
};

Также есть входной объект, на основе которого должно происходить слияние

var obj2 = {
          type: "type1",
          nested: {
                level1: [
                  { field: "field1", value: "val1"},
                  { field: "field3", value: "val5" }
                ]
          },
          in: 0,
          out: 20
};

На основе нового объекта I необходимо объединить, и в результате должно быть только уникальное. В моем случае объект может go глубоко до уровня 2. Единственное, что мне нужно, - это манипулирование «вложенным» объектом. Если присутствуют те же ключи, обновите значение, иначе просто добавьте его. Также содержимое «вложенного» объекта obj2 всегда будет присутствовать в «вложенном» объекта obj1. Если что-то из «вложенного» объекта obj2 отсутствует в «вложенном» объекта obj1, удалите этот объект. Файл тестовых примеров, прикрепленный внутри песочницы

Вывод должен выглядеть следующим образом:

result = {
              type: "type1",
              nested: {
                      level1: [
                                { field: "field1", value: "val1"},
                                { field: "field2", value: "val2"},
                                { field: "field3", value: "val5" },
                                {
                                 level2: 
                                     [
                                         {
                                           field: "abc",
                                           value: "11",
                                         },
                                         {
                                           field: "abc",
                                           value: "12",  
                                         }
                                      ]
                                    }
                                  ]
                             },
                            in: 0,
                            out: 20
    };

Метод, который я пробовал:

const merged = [...new Set([...obj1.nested.level1, ...obj2.nested.level1])]

Песочница: https://codesandbox.io/s/angry-liskov-e5m1m

1 Ответ

1 голос
/ 14 февраля 2020

Просто Google "глубокое объединение javascript" или "объединить вложенные объекты". Здесь - один из примеров того, что я нашел:

// Merge a `source` object to a `target` recursively
const merge = (target, source) => {
  // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties
  for (const key of Object.keys(source)) {
    if (source[key] instanceof Object) Object.assign(source[key], merge(target[key], source[key]))
  }

  // Join `target` and modified `source`
  Object.assign(target || {}, source)
  return target
}

console.log(merge(obj1, obj2));
...