_.assign仅当目标对象中存在属性时

spa*_*y02 11 javascript lodash

我需要做一些像_.assign这样的事情,但前提是目标对象已经分配了属性.可以想象它就像源对象可能有一些属性要贡献,但也有一些我不想混入的属性.

我没有使用_.assign的回调机制,但尝试了以下内容.它"工作",但它仍然将属性分配给dest对象(未定义).我根本不希望它分配.

_.assign(options, defaults, initial, function (destVal, sourceVal) {
  return typeof destVal == 'undefined' ? undefined : sourceVal;
});
Run Code Online (Sandbox Code Playgroud)

我写了以下函数来做到这一点,但想知道lodash是否已经有更多优雅的东西.

function softMerge (dest, source) {
    return Object.keys(dest).reduce(function (dest, key) {
      var sourceVal = source[key];

      if (!_.isUndefined(sourceVal)) {
        dest[key] = sourceVal;
      }

      return dest;
    }, dest);
}
Run Code Online (Sandbox Code Playgroud)

ne8*_*8il 21

您可以从第一个对象中获取密钥

var firstKeys = _.keys(options);
Run Code Online (Sandbox Code Playgroud)

然后从第二个对象中获取一个子集对象,仅获取第一个对象上存在的那些键:

var newDefaults = _.pick(defaults, firstKeys);
Run Code Online (Sandbox Code Playgroud)

然后使用该新对象作为您的参数_.assign:

_.assign(options, newDefaults);
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

_.assign(options, _.pick(defaults, _.keys(options)));
Run Code Online (Sandbox Code Playgroud)

我在这里测试时似乎工作:http://jsbin.com/yiyerosabi/1/edit?js,console