我有两个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中合并两个数组,以便从每个数组中只获得唯一的项目,其顺序与它们插入原始数组的顺序相同?
当前回答
这很快,可以整理任意数量的数组,并且可以处理数字和字符串。
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]);
这可能更好。
其他回答
如果您合并对象数组,请考虑使用lodash UnionBy函数,它允许您设置自定义谓词比较对象:
import { unionBy } from 'lodash';
const a = [{a: 1, b: 2}];
const b = [{a: 1, b: 3}];
const c = [{a: 2, b: 4}];
const result = UnionBy(a,b,c, x => x.a);
结果是:〔{a:1;b:2},{a:2;b:4}〕
结果中使用了来自数组的第一个传递匹配
这很简单,可以用jQuery在一行中完成:
var arr1 = ['Vijendra', 'Singh'], arr2 =['Singh', 'Shakya'];
$.unique(arr1.concat(arr2))//one line
["Vijendra", "Singh", "Shakya"]
只是把我的两分钱扔进去。
function mergeStringArrays(a, b){
var hash = {};
var ret = [];
for(var i=0; i < a.length; i++){
var e = a[i];
if (!hash[e]){
hash[e] = true;
ret.push(e);
}
}
for(var i=0; i < b.length; i++){
var e = b[i];
if (!hash[e]){
hash[e] = true;
ret.push(e);
}
}
return ret;
}
这是我经常使用的方法,它使用一个对象作为哈希查找表来执行重复检查。假设哈希值是O(1),那么这将在O(n)中运行,其中n是a.length+b.length。老实说,我不知道浏览器是如何进行哈希的,但它在数千个数据点上表现良好。
[...array1,...array2] // => don't remove duplication
OR
[...new Set([...array1 ,...array2])]; // => remove duplication
Use:
Array.prototype.merge = function (arr) {
var key;
for(key in arr)
this[key] = arr[key];
};