Javascript (ES6 + Loda sh) объединение исходного объекта с другим обновлением только общих свойств, глубоко - PullRequest
0 голосов
/ 03 марта 2020

Мне необходимо глубоко обновить предоставленный объект, сохранив только свойства / пути, найденные в исходном объекте. Я пробовал Loda sh .merge, но он объединяет все свойства второго объекта, я хочу объединить только свойства, найденные в исходном объекте.

Вот пример:

const ob1 = {
  a1: {
    b1: 2
  },
  a2: 5
}

const obj2 = {
  a1: {
    b1: 4,
    b2: 9
  },
  a3: 6
}

expected result = {
  a1: {
    b1: 4
  },
  a2: 5
}

Я бы хотел самое простое решение с es6 или loda sh utils.

Есть идеи? Спасибо!

1 Ответ

1 голос
/ 03 марта 2020

Если вы хотите создать собственную стратегию слияния, возможно, вы сможете написать собственную рекурсивную функцию. В рекурсивной функции вы в основном передаете свою цель и свой источник. Исходя из вашего вопроса, цель будет obj1, а источник будет obj2.

Ваш лог c таков:

  1. Если obj1 нет содержит ключ, который находится в obj2, мы сохраняем пару ключ-значение из obj1, источник
  2. Если obj1 содержит ключ obj2, то:
    • Если они просто не являются объектами, мы допускаем переопределение значения obj2 obj1 value
    • Если они оба являются объектами, то мы снова вызываем одну и ту же рекурсивную функцию

См. Подтверждение концепции ниже:

const obj1 = {
  a1: {
    b1: 2
  },
  a2: 5
}

const obj2 = {
  a1: {
    b1: 4,
    b2: 9
  },
  a3: 6
}

function smartMerge(target, source) {
  const o = {};
  
  // Iterate throught all keys in your target
  for(let k in target) {
  
    // If a matching key is found in source
    if (k in source) {
      // If they are both objects, then we run recurisve merge logic
      if (typeof target[k] === 'object' && typeof source[k] === 'object') {
        o[k] = smartMerge(target[k], source[k]);
      }
      // Otherwise, we let the source override the value
      else {
        o[k] = source[k];
      }
    }
    
    // If no matching key is found, we keep the target value
    else {
      o[k] = target[k];
    }
  }
  
  return o;
}

const result = smartMerge(obj1, obj2);

/* Expected:
{
  a1: {
    b1: 4
  },
  a2: 5
}
*/
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
...