场景:
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/