如何合并两个几乎相同的数组/对象(使用下划线或类似的库)?

时间:2015-11-04 21:05:47

标签: javascript arrays object underscore.js

我们有一个旧列表和一个新列表。即使添加了一些新的键值对,该计划也要合并。

var oldList = [{
  id: 1,
  name: 'Michael',
  sex: 'male',
  goodlooking: 1
}, {
  id: 2,
  name: 'John',
  sex: 'male'
}, {
  id: 3,
  name: 'Laura',
  sex: 'female'
}];

和...

var newList = [{
  id: 1,
  name: 'Cindy',
  sex: 'female'
}, {
  id: 2,
  name: 'Herry',
  sex: 'male'
}, {
  id: 3,
  name: 'Laura',
  sex: 'female',
  goodlooking: 1
}];

现在我试图将这两者合并在一起,并通过替换相等键的值来充分利用它们。特别是合并列表应如下所示:

var mergedList = [{
  id: 1,
  name: 'Cindy',
  sex: 'female',
  goodlooking: 1
}, {
  id: 2,
  name: 'Herry',
  sex: 'male'
}, {
  id: 3,
  name: 'Laura',
  sex: 'female',
  goodlooking: 1
}];
迈克尔改变了他的名字和性别,但保持良好的状态。约翰改名为亨利,劳拉发现了她的内在美。

5 个答案:

答案 0 :(得分:4)

var mergedList = _.map(oldList, function (oldElem) {
    var newElem = _.find(newList, {id: oldElem.id});
    return _.merge(oldElem, newElem);
});

答案 1 :(得分:2)

普通Javascript中的解决方案:

var oldList = [{ id: 1, name: 'Michael', sex: 'male', goodlooking: 1 }, { id: 2, name: 'John', sex: 'male' }, { id: 3, name: 'Laura', sex: 'female' }],
    newList = [{ id: 1, name: 'Cindy', sex: 'female' }, { id: 2, name: 'Herry', sex: 'male' }, { id: 3, name: 'Laura', sex: 'female', goodlooking: 1 }],
    theList = JSON.parse(JSON.stringify(oldList)); // make copy

newList.forEach(function (a) {
    theList.some(function (b) {
        if (a.id === b.id) {
            Object.keys(a).forEach(function (k) {
                b[k] = a[k];
            });
            return true;
        }
    });
});
document.write('<pre>' + JSON.stringify(theList, 0, 4) + '</pre>');

答案 2 :(得分:1)

这样的事可能吗?

将使用newList中可用的值覆盖oldList中的所有内容,并添加新值(如果它们存在)。

mergedList = [];
_.each(oldList, function(listItem, index){
    copy = listItem;
    newValues = _.findWhere(newList, {"id": listItem.id});
    _.each(newValues, function(val,key){
        copy[key] = val;
    });
    mergedList[index] = copy
});

答案 3 :(得分:0)

有些想法:

var a = oldList.length,
    mergedList = [];
while(a--){
    var oldData = oldList[a];
        newKeys = Object.keys(newList[a]);
    for (var i=0;i<newKeys.length;i++){
        var key = newKeys[i];
        oldData[key] = newList[a][key]
    }

}

答案 4 :(得分:0)

直接使用lodash的合并方法。

var mergedList = _.merge(oldList, newList);

它以递归方式合并自己的可枚举属性 https://lodash.com/docs#merge