我有两个JavaScript数组:
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
我希望输出为:
var array3 = ["Vijendra","Singh","Shakya"];
输出数组应删除重复的单词。
如何在JavaScript中合并两个数组,以便从每个数组中只获得唯一的项目,其顺序与它们插入原始数组的顺序相同?
我有两个JavaScript数组:
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
我希望输出为:
var array3 = ["Vijendra","Singh","Shakya"];
输出数组应删除重复的单词。
如何在JavaScript中合并两个数组,以便从每个数组中只获得唯一的项目,其顺序与它们插入原始数组的顺序相同?
当前回答
作为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(),这个答案是可能的。
取两个数组a和b
var a = ['a','b','c'];
var b = ['d','e','f'];
var c = a.concat(b);
//c is now an an array with: ['a','b','c','d','e','f']
只需避开嵌套循环(O(n^2))和.indexOf()(+O(n))。
函数合并(a,b){var哈希={};变量i;对于(i=0;i<a.length;i++){hash[a[i]=真;}对于(i=0;i<b.length;i++){hash[b[i]]=真;}return Object.keys(哈希);}var array1=[“Vijendra”,“Singh”];var array2=[“Singh”,“Shakya”];var array3=合并(array1,array2);console.log(array3);
这里有一个稍微不同的循环。通过Chrome最新版本中的一些优化,它是解决两个数组联合的最快方法(Chrome 38.0.2111)。
http://jsperf.com/merge-two-arrays-keeping-only-unique-values
var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];
var array3 = [];
var arr = array1.concat(array2),
len = arr.length;
while (len--) {
var itm = arr[len];
if (array3.indexOf(itm) === -1) {
array3.unshift(itm);
}
}
while循环:约589k ops/s滤波器:~44k ops/slodash:30.8万次/秒对于循环:225k操作/秒
一条评论指出,我的一个设置变量导致我的循环领先于其他循环,因为它不需要初始化一个空数组来写入。我同意这一点,所以我已经将测试重写为公平的环境,并包含了一个更快的选项。
http://jsperf.com/merge-two-arrays-keeping-only-unique-values/52
let whileLoopAlt = function (array1, array2) {
const array3 = array1.slice(0);
let len1 = array1.length;
let len2 = array2.length;
const assoc = {};
while (len1--) {
assoc[array1[len1]] = null;
}
while (len2--) {
let itm = array2[len2];
if (assoc[itm] === undefined) { // Eliminate the indexOf call
array3.push(itm);
assoc[itm] = null;
}
}
return array3;
};
在另一种解决方案中,我结合了一个答案的关联数组解决方案,以消除循环中的.indexOf()调用,该调用通过第二个循环大大降低了速度,并包含了其他用户在其答案中建议的一些其他优化。
这里的最高答案是每个值(i-1)都有一个双循环,但速度仍然很慢。lodash仍然做得很好,我仍然会向任何不介意在项目中添加库的人推荐它。对于那些不想这样做的人来说,我的while循环仍然是一个很好的答案,过滤器的答案在这里表现得很好,在我的测试中击败了最新的Canary Chrome(44.0.2360)。
如果你想加快速度,看看迈克和丹·斯托克的答案。在经历了几乎所有可行的答案之后,这些是迄今为止所有结果中最快的。
您可以简单地使用ECMAScript 6,
var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];
var array3 = [...new Set([...array1 ,...array2])];
console.log(array3); // ["Vijendra", "Singh", "Shakya"];
使用排列运算符串联阵列。使用Set创建一组不同的元素。再次使用排列运算符将集合转换为数组。