我有两个JavaScript数组:

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

我希望输出为:

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

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

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


当前回答

带过滤器的最简单解决方案:

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

var mergedArrayWithoutDuplicates = array1.concat(
  array2.filter(seccondArrayItem => !array1.includes(seccondArrayItem))
);

其他回答

对于ES6,只有一行:

a = [1, 2, 3, 4]
b = [4, 5]
[...new Set(a.concat(b))]  // [1, 2, 3, 4, 5]
array1.concat(array2).filter((value, pos, arr)=>arr.indexOf(value)===pos)

这一行的优点在于性能,而且在使用数组时,通常都是链接方法,如filter、map等,因此您可以添加这一行,它将使用array1对array2进行合并和重复数据消除,而无需引用后面的一行(当您链接没有的方法时),例如:

someSource()
.reduce(...)
.filter(...)
.map(...) 
// and now you want to concat array2 and deduplicate:
.concat(array2).filter((value, pos, arr)=>arr.indexOf(value)===pos)
// and keep chaining stuff
.map(...)
.find(...)
// etc

(我不想污染Array.prototype,这将是尊重链的唯一方式——定义一个新函数将打破它——所以我认为这样做是实现这一点的唯一方式)

使用集合(ECMAScript 2015),将非常简单:

const array1=[“Vijendra”,“Singh”];const array2=[“Singh”,“Shakya”];console.log(Array.from(new Set(array1.concat(array2))));

作为LiraNuna的一部分的单线解决方案:

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

// Merges both arrays
let array3 = array1.concat(array2); 

//REMOVE DUPLICATE
let removeDuplicate = [...new Set(array3)];
console.log(removeDuplicate);

减少他们!!!

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

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