javascript - 使用 Lodash 将最后一个树节点合并到数组中

标签 javascript arrays object merge lodash

场景:

const obj1 = {
  a: 100,
  b: 200,
  c: { c1: 100 }
}

const obj2 = {
  b: 250,
  c: { c1: 200 },
  d: { d1: { d1a: 400 } }
}

期望的结果:

someMergeFn(obj1, obj2)

// Should return...

{
  a: [100],
  b: [200, 250],
  c: { c1: [100, 200] },
  d: { d1: { d1a: [400] } }
}


我的尝试如下,但我无法接近预期的结果。

const obj1 = {
  a: 100,
  b: 200,
  c: { c1: 100 }
}

const obj2 = {
  b: 250,
  c: { c1: 200 },
  d: { d1: { d1a: 400 } }
}

const merged = _.mergeWith(
  obj1,
  obj2,
  (first, second) =>
    Array.isArray(first) ? first.push(second) : [first, second]
)

console.log(merged)
<script src="https://cdn.jsdelivr.net/npm/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="aec2c1cacfddc6ee9a809f99809f9b" rel="noreferrer noopener nofollow">[email protected]</a>/lodash.min.js"></script>

最佳答案

使用空对象开始合并。这将防止第一个对象发生突变,并将所有值开始为空,在这种情况下,我们将提供一个空数组作为 first 的默认值。

只要第二个值不是对象(或数组),我们就可以假设第一个值是数组,并使用展开(或连接)将它们组合成一个新数组。如果没有,我们返回undefined,以便_.mergeWith() 处理对象/数组的合并。

const obj1 = {"a":100,"b":200,"c":{"c1":100}}
const obj2 = {"b":250,"c":{"c1":200},"d":{"d1":{"d1a":400}}}

const merged = _.mergeWith(
  {},
  obj1,
  obj2,
  (first, second) =>
    !_.isObject(second) ? [...(first || []), second] : undefined
)

console.log(merged)
<script src="https://cdn.jsdelivr.net/npm/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="264a494247554e6612081711081713" rel="noreferrer noopener nofollow">[email protected]</a>/lodash.min.js"></script>

关于javascript - 使用 Lodash 将最后一个树节点合并到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61927632/

相关文章:

javascript - 未捕获的 URIError : URI malformed - jquery UI tabs on Windows

javascript - 可以在ajax调用中传递html元素

Javascript:访问多维数组

arrays - 使用之字形排序将 1d 矩阵转换为 2d 矩阵

c - C中while循环中的数组

javascript - Vue js 数据绑定(bind)不起作用

javascript - 是否可以使用 2 个工厂函数来填充 1 个实例?

javascript - 如何在 javascript 中扩充父类(super class)中的方法

javascript - 如何在 Vue.js 中获取对象数组中的键

python - Python中的多维数组类和线对象