如何用lodash克隆所有非未定义的属性?

时间:2015-12-18 03:18:40

标签: javascript node.js lodash

给出两个对象:

let source = {
    a: 1,
    b: 2,
    c: { x: 1, y: 2, z: 3 }
};
let overrides = {
    b: undefined,
    d: 4
};

如何使用lodash模块生成具有以下深度克隆值的新对象?

let result = _.cloneDeep(source, excludeKeysThatAreUndefinedInOverrides);
_.assign(result, overrides, excludeKeysThatAreUndefinedInOverrides);

console.log(result);
// {
//     a: 1,
//     c: { x: 1, y: 2, z: 3 },
//     d: 4
// };

完全排除密钥“b”(即未分配undefined值)。

3 个答案:

答案 0 :(得分:2)

使用_.extend合并sourceoverrides,然后使用_.pick删除undefined

let source = {
    a: 1,
    b: 2,
    c: { x: 1, y: 2, z: 3 }
};
let overrides = {
    b: undefined,
    d: 4
};
let result = _.extend(source, overrides);
result = _.pick(result, function(element) {
    return typeof element != "undefined";
});
console.log(result);

JSfiddle

答案 1 :(得分:2)

最佳答案有效。

这是一个较短的版本:

let result = _.extend(source, overrides);
result = _.omit(result, _.isUndefined);

我喜欢链接:

let result = _.chain(source)
  .extend(overrides)
  .omit(_.isUndefined)
  .value();

答案 2 :(得分:2)

这是Quy提供的答案的推导,它执行深度克隆并使用_.extend分配覆盖值而不是浅拷贝:

let result = _.chain(source)
    .cloneDeep()
    .extend(overrides)
    .omit(_.isUndefined)
    .value();