我有两个JavaScript数组:

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

我希望输出为:

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

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

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


当前回答

只需使用Undercore.js的=>uniq即可实现:

array3 = _.uniq(array1.concat(array2))

console.log(array3)

它将印刷[“Vijendra”、“Singh”、“Shakya”]。

其他回答

为此……这里有一个单行解决方案:

const x = [...new Set([['C', 'B'],['B', 'A']].reduce( (a, e) => a.concat(e), []))].sort()
// ['A', 'B', 'C']

不是特别可读,但它可能会帮助某人:

将初始累加器值设置为空数组的reduce函数应用于空数组。reduce函数使用concat将每个子数组附加到累加器数组上。其结果作为构造函数参数传递,以创建新的Set。排列运算符用于将集合转换为数组。sort()函数应用于新数组。

//Array.indexOf was introduced in javascript 1.6 (ECMA-262) 
//We need to implement it explicitly for other browsers, 
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt, from)
  {
    var len = this.length >>> 0;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
//now, on to the problem

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

var merged = array1.concat(array2);
var t;
for(i = 0; i < merged.length; i++)
  if((t = merged.indexOf(i + 1, merged[i])) != -1)
  {
    merged.splice(t, 1);
    i--;//in case of multiple occurrences
  }

其他浏览器的indexOf方法的实现取自MDC

减少他们!!!

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

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(),这个答案是可能的。

可以使用新的“集”删除重复

[...new Set([...array1 ,...array2])]

最佳解决方案。。。

您可以直接在浏览器控制台中点击。。。

无重复项

a = [1, 2, 3];
b = [3, 2, 1, "prince"];

a.concat(b.filter(function(el) {
    return a.indexOf(el) === -1;
}));

具有重复项

["prince", "asish", 5].concat(["ravi", 4])

如果你想要没有重复,你可以从这里尝试一个更好的解决方案-大喊代码。

[1, 2, 3].concat([3, 2, 1, "prince"].filter(function(el) {
    return [1, 2, 3].indexOf(el) === -1;
}));

在Chrome浏览器控制台上试用

 f12 > console

输出:

["prince", "asish", 5, "ravi", 4]

[1, 2, 3, "prince"]