我试图使用Lodash将对象A合并到对象B中,但我遇到的麻烦是对象A有一些未定义的值,我希望将它们复制到对象B。
_.merge()的Lodash文档说:
"递归地合并源对象的自己的可枚举属性,这些属性不会被解析为未定义到目标对象。"
是否有其他功能可以执行此操作,还是可以轻松覆盖?
编辑A:
示例输入:
A = {
name: "Bob Smith",
job: "Racing Driver",
address: undefined
}
B = {
name: "Bob Smith",
job: "Web Developer",
address: "1 Regent Street, London",
phone: "0800 800 80"
}
预期产出
B = {
name: "Bob Smith",
job: "Racing Driver",
address: undefined,
phone: "0800 800 80"
}
编辑B:
要确认,它需要是一个深层次的"合并。 object可能包含嵌套对象。
答案 0 :(得分:2)
最简单的方法是使用第3个包https://github.com/unclechu/node-deep-extend,其目标只是深度合并而不是其他任何东西。
答案 1 :(得分:1)
_.assign
/_.extend
会这样做:
_.assign(B, A);
答案 2 :(得分:0)
检查this。它是一个小小的要点,包含deep extend
lodash方法,您可以在自己的应用程序中使用它。这也可以让您获得所需的功能而无需在应用中添加其他依赖项(因为您已经使用 lodash )
答案 3 :(得分:0)
感谢@Bergi - https://stackoverflow.com/a/22581862/1828637 - assign
将保留undefined
。我在这里使用assignWith
做了一个定制器,用于与定制器深度合并,因为我在redux / react中使用它:
function keepUnchangedRefsOnly(objValue, srcValue) {
if (objValue === undefined) { // do i need this?
return srcValue;
} else if (isPlainObject(objValue)) {
return assignWith({}, objValue, srcValue, keepUnchangedRefsOnly);
} else if (Array.isArray(objValue)) {
if (isEmpty(objValue) && !isEmpty(srcValue))return [...srcValue];
else if (!isEmpty(objValue) && isEmpty(srcValue)) return objValue;
else if (isEmpty(objValue) && isEmpty(srcValue)) return objValue; // both empty
else return [ ...objValue, ...srcValue ];
}
}
答案 4 :(得分:0)
我已经像您一样遇到了这个问题。只需尝试将undefined
替换为null
。
示例:
const a = { something: 'has value' };
const b = { something: undefined };
const c = { something: null };
console.log(_.merge({}, a, b))
console.log(_.merge({}, a, c))
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>