如何使用自定义程序_cloneDeepWith_并添加属性

时间:2016-07-27 15:53:03

标签: javascript object clone lodash

我正在使用cloneDeepWith深深克隆Object,在某些情况下,如果key模块,则指定一个特定的值< / em>喜欢:

&#13;
&#13;
const myObject = {
  foo: [1, 2, 3],
  bar: {
    module: 'lorem ipsum',
    test: 123
  },
  module: 'hello'
}

function customizer(val, key, obj) {
  if (key === 'module') {
    return 'custom'
  }
}

const clonedObject = _.cloneDeepWith(myObject, customizer)

console.log(clonedObject)
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.14.0/lodash.min.js"></script>
&#13;
&#13;
&#13;

问题

关键是现在我需要在满足条件的情况下添加一些属性。例如,如果迭代中的obj具有key === 'test',请添加一些属性。请参阅以下代码:

const myCustomProps = { a: 'lorem', b: 'ipsum' }

function customizer(val, key, obj) {
  if (obj.hasOwnProperty('test')) {

    //---> Hoping could return the Object instead of value, like:
    return Object.assign({}, obj, {
      ...myCustomProps
    })
  }
}

const clonedObject = _.cloneDeepWith(myObject, customizer)

可能 cloneDeepWith 它不是正确使用的function,但我无法在整个Lodash documentation中找到正确的MS Office。< / p>

1 个答案:

答案 0 :(得分:1)

我认为您必须单独执行克隆和分配。获得克隆对象后,可以使用分配新道具的函数递归调用_.forEach。在此示例中,具有键'test'的所有对象都将添加新道具。

&#13;
&#13;
const myCustomProps = { a: 'lorem', b: 'ipsum' }

const clonedObject = {
  foo: [1, 2, { test: 123 }],
  bar: {
    module: 'custom',
    test: 123,
    baz: {
      test: 123,
    }
  },
  module: 'custom'
}

function iteratee(val) {
  // Base case
  if (!val || (typeof val !== 'object' && !Array.isArray(val))) {
    return
  }

  // Recursively apply iteratee 
  _.forEach(val, iteratee)

  // Perform check
  if (val.hasOwnProperty('test')) {
    Object.assign(val, {...myCustomProps})
  }
}

const result = _.forEach(clonedObject, iteratee)

console.log(clonedObject)
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.14.0/lodash.min.js"></script>
&#13;
&#13;
&#13;