Javascript Lodash按第一项合并数组项

时间:2019-07-15 13:18:41

标签: javascript lodash

有一种通过第一项合并数组项的方法

_.merge({a: 1, c: [{y: 8}, {z: 9}]}, {b: 0, c: [{x: 5}]})

结果:

{
   "a": 1,
   "c": [
      {
         "y": 8,
         "x": 5
      },
      {
         "z": 9
      }
   ],
   "b": 0
}

我想要什么:

{
   "a": 1,
   "c": [
      {
         "y": 8,
         "x": 5
      },
      {
         "z": 9,
         "x": 5 // <-------------------------
      }
   ],
   "b": 0
}

我想将源对象与另一个用于模型的源对象合并。如果是数组,则模型仅定义集合的第一项,而源对象应将第一个模型项反映到所有集合项中。

2 个答案:

答案 0 :(得分:1)

我实际上不会这样做,因为这可能会非常令人困惑(尤其是当您的数组中包含一项以上的项目时)。

您可以使用_.mergeWith(),并手动迭代和合并数组项。

const mrg = (o1, o2) => _.mergeWith(
  o1, o2,
  (a, b) => _.isArray(a) && _.isArray(b) ?
    a.map((item, i) => mrg(item, b[Math.min(i, b.length - 1)]))
    : 
    undefined
)

const result = mrg({a: 1, c: [{y: 8}, {z: 9}]}, {b: 0, c: [{x: 5}]})

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.14/lodash.js"></script>

答案 1 :(得分:0)

使用_.mergeWith

function customizer(objValue, srcValue) {
    if (_.isArray(objValue) && _.every(objValue, _.isObject) &&
        _.isArray(srcValue) && _.every(srcValue, _.isObject) )
    {   
        let newObj = Object.assign(...srcValue)
        _.forEach(objValue, function(obj, index) {
            objValue[index] = Object.assign(obj, newObj)
        });
    }
}

let a = {a: 1, c: [{y: 8}, {z: 9}]}
let b = {b: 0, c: [{x: 5}]}
let res = _.mergeWith(a, b, customizer)

结果:

{
    "a": 1,
    "c": [
        {
            "y": 8,
            "x": 5
        },
        {
            "z": 9,
            "x": 5
        }
    ],
    "b": 0
}