通过id合并两个数组的有效方法,无需重复

时间:2014-10-22 09:42:24

标签: javascript arrays merge duplicate-removal

我有这些数组:

var first = [
    {id: 10, other: '10 - dolor'},
    {id: 12, other: '12 - sit'},
    {id: 54, other: '54 - from first'}
];

var second = [
    {id: 2, other: '2 - lorem'},
    {id: 54, other: '54 - from second'},
    {id: 80, other: '80 - ipsum'}
];

我如何通过id合并它们,而不重复?如果存在重复,则无需合并该行。我尝试了LoDash,但我无法找到解决方案。

我想得到这个结果:

var first = [
    {id: 10, other: '10 - dolor'},
    {id: 12, other: '12 - sit'},
    {id: 54, other: '54 - from first'},
    {id: 2, other: '2 - lorem'},
    {id: 80, other: '80 - ipsum'}
];

我需要一个有效的解决方案,因为会有一个巨大的来源。

3 个答案:

答案 0 :(得分:2)

我不确定它的性能,但您可以将ID存储在数组中,如果数组不包含id,则将当前对象推送到first数组中:

var ids = first.map(function (e) {
    return e.id;
});

var l = second.length;
for ( var i = 0; i < l; i++ ) {
    if (ids.indexOf(second[i].id) === -1) {
        first.push(second[i]);
        ids.push(second[i].id);
    }
} 

http://jsfiddle.net/thwny1at/

编辑:旧版浏览器不支持EcmaScript5的Array.prototype.map,为了支持这些浏览器,您可以使用polyfill或将map调用替换为简单的for环。

答案 1 :(得分:1)

这是一个demo 它使用underscore方法。

_(second).each(function(si){ 
    if(!_(first).any(function(fi){ return fi.id == si.id }))
    {
        first.push(si);
    }
});

答案 2 :(得分:0)

您可以尝试jquery externd

var arr1 = [ 1 ,2 ,3 ];
var arr2 = [ 1 ,2 ,3 ,4 ];
var k = new Array();

$.extend(k,arr1,arr2);

结果: ķ [1,2,3,4]