【问题标题】:Shortest Way to Merge JavaScript Objects Based on Path基于路径合并 JavaScript 对象的最短方法
【发布时间】:2023-04-05 22:12:01
【问题描述】:

任何人都知道如何进一步压缩我的 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)})
)

【问题讨论】:

  • 您是否关心是就地合并它们还是真的有必要创建新对象?
  • 不。两者都可以。
  • 然后只需执行_.merge(_.get(obj1, objsPath), _.get(obj2, objsPath))(如果您想将其放入mergePath 函数中,则返回obj1)。或者使用Object.assign 而不是lodash merge

标签: javascript object lodash javascript-objects


【解决方案1】:

您可以使用_.merge() 将路径从obj2 复制到obj2。然后可以返回obj1(我用过comma operator):

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>

【讨论】:

  • 我可能弄错了,但这在技术上不是副作用吗?
  • 但是,它是一个没有用大括号括起来的 es6 箭头函数。所以,它会隐式返回
【解决方案2】:

不使用外部库的最简单方法

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
     }
   }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多