lodash mergeWith,跳过一些关键

时间:2017-06-02 04:17:03

标签: merge lodash

function merger(objValue, srcValue, key, object, source, stack) {
  switch (key) {
    case 'keya':
    case 'keyb':
    case 'keyc':
      return null
  }
}

mergeWith({}, oldObj, newObj, merger)

当key等于某个值时,我想跳过合并。但是,当{keya: null}具有newObj时,上述代码的输出将具有keya的输出。

我可以跳过合并,以便密钥不在输出中吗?

3 个答案:

答案 0 :(得分:1)

简单回答: _.mergeWith无法实现。

您可以在此处查看https://github.com/lodash/lodash/issues/2966。您必须使用其他进程再次删除null值的属性。像,

_.omitBy(mergedObj, _.isNull);

答案 1 :(得分:0)

完全可以这样做:

"#{}"

答案 2 :(得分:0)

这里的an implementation of omitDeep将忽略在对象结构中任何地方传递谓词的键/值。

function omitDeep(value, predicate = (val) => !val) {
  return _.cloneDeepWith(value, makeOmittingCloneDeepCustomizer(predicate))
}

function makeOmittingCloneDeepCustomizer(predicate) {
  return function omittingCloneDeepCustomizer(value, key, object, stack) {
    if (_.isObject(value)) {
      if (_.isArray(value)) {
        return _(value).reject(predicate).map(item => _.cloneDeepWith(item, omittingCloneDeepCustomizer))
      }

      const clone = {}
      for (const subKey of Object.keys(value)) {
        if (!predicate(value[subKey])) {
          clone[subKey] = _.cloneDeepWith(value[subKey], omittingCloneDeepCustomizer)
        }
      }
      return clone
    }

    return undefined
  }
}