我有两个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);
其他回答
我在尝试做同样的事情时遇到了这个帖子,但我想尝试一些不同的东西。我刚刚完成了下面的功能。我还有另一个变量“compareKeys”(键数组),用于进行浅对象比较。我将来可能会把它改成一个函数。
无论如何,我没有包括那部分,因为它不适用于这个问题。我还将代码放入jsperf中。编辑:我修复了jsperf中的条目。与140k相比,我的函数的运算速度约为99k次/秒。
对于代码:我首先创建一个可用索引数组,然后通过迭代第一个数组来消除它们。最后,我通过使用两个数组之间不匹配的缩减索引数组来插入“剩余部分”。
http://jsperf.com/merge-two-arrays-keeping-only-unique-values/26
function indiceMerge(a1, a2) {
var ai = [];
for (var x = 0; x < a2.length; x++) {
ai.push(x)
};
for (var x = 0; x < a1.length; x++) {
for (var y = 0; y < ai.length; y++) {
if (a1[x] === a2[ai[y]]) {
ai.splice(y, 1);
y--;
}
}
}
for (var x = 0; x < ai.length; x++) {
a1.push(a2[ai[x]]);
}
return a1;
}
合并两个阵列有很多解决方案。它们可以分为两大类(除了使用lodash或underline.js等第三方库)。
a) 组合两个数组并删除重复项。
b) 在组合项目之前过滤掉它们。
合并两个数组并删除重复项
结合
// mutable operation(array1 is the combined array)
array1.push(...array2);
array1.unshift(...array2);
// immutable operation
const combined = array1.concat(array2);
const combined = [...array1, ...array2]; // ES6
统一
统一数组有很多方法,我个人建议使用以下两种方法。
// a little bit tricky
const merged = combined.filter((item, index) => combined.indexOf(item) === index);
const merged = [...new Set(combined)];
在组合项目之前筛选出项目
还有很多方法,但我个人建议使用以下代码,因为它简单。
const merged = array1.concat(array2.filter(secItem => !array1.includes(secItem)));
如果要检查唯一对象,请在比较中使用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;
}
这很快,可以整理任意数量的数组,并且可以处理数字和字符串。
function collate(a){ // Pass an array of arrays to collate into one array
var h = { n: {}, s: {} };
for (var i=0; i < a.length; i++) for (var j=0; j < a[i].length; j++)
(typeof a[i][j] === "number" ? h.n[a[i][j]] = true : h.s[a[i][j]] = true);
var b = Object.keys(h.n);
for (var i=0; i< b.length; i++)
b[i]=Number(b[i]);
return b.concat(Object.keys(h.s));
}
> a = [ [1,2,3], [3,4,5], [1,5,6], ["spoon", "fork", "5"] ]
> collate( a )
[1, 2, 3, 4, 5, 6, "5", "spoon", "fork"]
如果你不需要区分5和“5”,那么
function collate(a){
var h = {};
for (i=0; i < a.length; i++) for (var j=0; j < a[i].length; j++)
h[a[i][j]] = typeof a[i][j] === "number";
for (i=0, b=Object.keys(h); i< b.length; i++)
if (h[b[i]])
b[i]=Number(b[i]);
return b;
}
[1, 2, 3, 4, "5", 6, "spoon", "fork"]
可以。
如果你不介意(或者更愿意)所有值都以字符串结尾,那么就这样:
function collate(a){
var h = {};
for (var i=0; i < a.length; i++)
for (var j=0; j < a[i].length; j++)
h[a[i][j]] = true;
return Object.keys(h)
}
["1", "2", "3", "4", "5", "6", "spoon", "fork"]
如果您实际上不需要数组,但只想收集唯一值并对其进行迭代,那么(在大多数浏览器(和node.js)中):
h = new Map();
for (i=0; i < a.length; i++)
for (var j=0; j < a[i].length; j++)
h.set(a[i][j]);
这可能更好。
ES6提供了一种单线解决方案,通过使用析构函数和集合来合并多个数组而不重复。
const array1 = ['a','b','c'];
const array2 = ['c','c','d','e'];
const array3 = [...new Set([...array1,...array2])];
console.log(array3); // ["a", "b", "c", "d", "e"]