Кратчайший способ объединения объектов JavaScript на основе пути - PullRequest
0 голосов
/ 17 мая 2018

Кто-нибудь знает, как я мог бы дополнительно сжать мой метод mergePath, который объединяет ключи двух объектов на основе пути ключ / значение?Мое решение ниже использует Lodash.

let obj1 = { z: {fields: { a: "200", b: "2" }}}
let obj2 = { z: {fields: { a: "2", b: "20" }}}
let objsPath = "z.fields"

let mergePath = (objsPath, obj1, obj2) => (
  _.set(obj1, objsPath, {..._.get(obj1, objsPath), ..._.get(obj2, objsPath)})
)

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Самый простой способ без использования внешней библиотеки

const obj1 = { z: {fields: { a: "200", b: "2", c: "66" }}}
const obj2 = { z: {fields: { a: "2", b: "20" }}}

const mergedObj = {z: {fields: {}}}
Object.assign(mergedObj.z.fields ,obj1.z.fields, obj2.z.fields)

console.log(mergedObj)

Другой способ - использование оператора распространения объекта, но вам необходимо babel preset, чтобы использовать эту функцию - Это своего рода будущий синтаксис .:) Этот синтаксис будет выглядеть как

const mergedObj = {
  z: {
    fields: {
      ...obj1.z.fields,
      ...obj2.z.fields
     }
   }
 }
0 голосов
/ 17 мая 2018

Вы можете использовать _.merge(), чтобы скопировать путь из obj2 в obj2. Затем вы можете вернуть obj1 (я использовал оператор запятой ):

const obj1 = { z: {fields: { a: "200", b: "2" }}}
const obj2 = { z: {fields: { a: "2", b: "20" }}}
const objsPath = "z.fields"

const mergePath = (objsPath, obj1, obj2) => (
  _.merge(_.get(obj1, objsPath), _.get(obj2, objsPath)), obj1
)

console.log(mergePath(objsPath, obj1, obj2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
...