Lodash合并包括未定义的值

时间:2014-03-22 17:43:31

标签: javascript lodash

我试图使用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可能包含嵌套对象。

5 个答案:

答案 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 ];
    }
}

这样的用法 - https://stackoverflow.com/a/49437903/1828637

答案 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>