我有两个JavaScript数组:

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];

我希望输出为:

var array3 = ["Vijendra","Singh","Shakya"];

输出数组应删除重复的单词。

如何在JavaScript中合并两个数组,以便从每个数组中只获得唯一的项目,其顺序与它们插入原始数组的顺序相同?


当前回答

使用Lodash

我发现@GijsjanB的答案很有用,但我的数组包含具有许多属性的对象,因此我不得不使用其中一个属性来消除它们的重复。

这是我使用lodash的解决方案

userList1 = [{ id: 1 }, { id: 2 }, { id: 3 }]
userList2 = [{ id: 3 }, { id: 4 }, { id: 5 }]
// id 3 is repeated in both arrays

users = _.unionWith(userList1, userList2, function(a, b){ return a.id == b.id });

// users = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 }]

作为第三个参数传递的函数有两个参数(两个元素),如果它们相等,则必须返回true。

其他回答

这是我需要合并(或返回两个数组的并集)时使用的函数。

var union = function (a, b) {
  for (var i = 0; i < b.length; i++)
    if (a.indexOf(b[i]) === -1)
      a.push(b[i]);
  return a;
};

var a = [1, 2, 3, 'a', 'b', 'c'];
var b = [2, 3, 4, 'b', 'c', 'd'];

a = union(a, b);
//> [1, 2, 3, "a", "b", "c", 4, "d"]

var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];

var array3 = union(array1, array2);
//> ["Vijendra", "Singh", "Shakya"]

我简化了这个答案的最佳部分,并将其转化为一个很好的函数:

function mergeUnique(arr1, arr2){
    return arr1.concat(arr2.filter(function (item) {
        return arr1.indexOf(item) === -1;
    }));
}

减少他们!!!

这种替代方法不是显式地合并和重复数据消除,而是采用一个数组并用另一个数组减少它,这样第一个数组的每个值都可以在累积行为中迭代和销毁,因为递归性,所以通过利用数组的持久性来忽略已经包含的值。

array2.reduce(reducer, array1.reduce(reducer, []))

测试示例:

var array1=[“Vijendra”,“Singh”,“辛格”];var array2=[“Singh”,“Shakya”,“Shakya”];const reducer=(accumulator,currentValue)=>accumulater.includes(currentValue)?累加器:[…累加器,currentValue];控制台日志(array2.reduce(reducer,array1.reduce,[])));//需要减少第一阵列,以确保减少第二阵列上用作初始值的重复数据消除阵列

结论

在枯燥乏味的时候,每一种方法都需要避免(并不是说它没有用处)。

处理重复数据消除的concat()限制。

不需要Undercore.js、JQuery或Lo Dash等外部库,也不需要创建任何内置函数来实现所需的合并和重复数据消除效果。

哦,嘿!,它可以作为一个内衬完成!!!


由于ES5(ECMAScript 2015)、漂亮的include()和华丽的reduce(),这个答案是可能的。

假设原始阵列不需要重复数据消除,这应该非常快,保持原始顺序,并且不会修改原始阵列。。。

function arrayMerge(base, addendum){
    var out = [].concat(base);
    for(var i=0,len=addendum.length;i<len;i++){
        if(base.indexOf(addendum[i])<0){
            out.push(addendum[i]);
        }
    }
    return out;
}

用法:

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
var array3 = arrayMerge(array1, array2);

console.log(array3);
//-> [ 'Vijendra', 'Singh', 'Shakya' ]

如果要检查唯一对象,请在比较中使用JSON.stringify。

function arrayUnique(array) {
    var a = array.concat();
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {
            if(JSON.stringify(a[i]) === JSON.stringify(a[j]))
                a.splice(j--, 1);
        }
    }

    return a;
}