使用lodash按属性合并2个已排序的对象数组

时间:2016-10-29 19:55:36

标签: javascript lodash

我正在尝试将两个对象数组合并在一起。

我已经预先排列了对象数组,以便它们匹配,我只需要在两个数组中的每个对象上推送属性。

我认为lodash会给我一个比双循环更清晰的解决方案,或者我应该只做一个vanilla JS解决方案?

两个数组的示例:

[
    {
        provider: 'foo',
        title: 'Title1'
    },
    {
        provider: 'bar',
        title: 'Title2'
    }
]

[
    {
        all: '0',
        novelty: '24'
    },
    {
        all: '4',
        novelty: '12'
    }
]

它应该返回:

[
    {
        provider: 'foo',
        title: 'Title1',
        all: '0',
        novelty: '24'
    },
    {
        provider: 'bar',
        title: 'Title2',
        all: '4',
        novelty: '12'
    }
]

3 个答案:

答案 0 :(得分:2)

如果没有lodash,您可以使用Array.prototype.map()Object.assign()(或angular.merge()如果目标浏览器不支持分配):

var arr1 = [{
      provider: 'foo',
      title: 'Title1'
    }, {
      provider: 'bar',
      title: 'Title2'
    }];

    var arr2 = [{
      all: '0',
      novelty: '24'
    }, {
      all: '4',
      novelty: '12'
    }];

    var result = arr1.map(function(item, index) {
      return Object.assign({}, item, arr2[index]);
    });

    console.log(result);

如果您想使用lodash,请_.zipWith()使用_.assign()

var arr1 = [{
  provider: 'foo',
  title: 'Title1'
}, {
  provider: 'bar',
  title: 'Title2'
}];

var arr2 = [{
  all: '0',
  novelty: '24'
}, {
  all: '4',
  novelty: '12'
}];

var result = _.zipWith(arr1, arr2, function(a, b) {
  return _.assign({}, a, b);
});

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

答案 1 :(得分:2)

您可以使用ES6执行此操作:

data1.map( (obj, i) => Object.assign({}, obj, data2[i]) )

var data1 = [{
        provider: 'foo',
        title: 'Title1'
    }, {
        provider: 'bar',
        title: 'Title2'
    }];
var data2 = [{
        all: '0',
        novelty: '24'
    }, {
        all: '4',
        novelty: '12'
    }];

var merged = data1.map( (obj, i) => Object.assign({}, obj, data2[i]) );

console.log(merged);

答案 2 :(得分:0)

到目前为止,这个问题的其他答案都是次优的,因为它们忽略了输入数组预先排序的陈述条件。 AFAIK lodash没有预先构建的方法来合并排序的数组,但谷歌搜索&#34;合并排序的数组&#34;将揭示许多伪代码来模仿。

例如,这里是http://www.algolist.net/Algorithms/Merge/Sorted_arrays的JS实现:

const mergeSortedArraysBy = (array1, array2, iteratee) => {
    const mergedArray = [];
    let i = 0;
    let j = 0;
    while (i < array1.length && j < array2.length) {
        if (iteratee(array1[i]) <= iteratee(array2[j])) {
            mergedArray.push(array1[i]);
            i++;
        } else {
            mergedArray.push(array2[j]);
            j++;
        }
    }
    if (i < array1.length) {
        for (let p = i; p < array1.length; p++) {
            mergedArray.push(array1[p]);
        }
    } else {
        for (let p = j; p < array2.length; p++) {
            mergedArray.push(array2[p]);
        }
    }
    return mergedArray;
};