如何用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值)。

热门答案的作品。

这是一个较短的版本:

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

我喜欢链接:

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

使用_.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 。

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

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