假设我有一个数组[34, 35, 45, 48, 49]
和另一个数组[48, 55]
. 我怎样才能得到一个结果数组[34, 35, 45, 48, 49, 55]
?
在 JavaScript 中获取两个数组的并集
IT技术
javascript
arrays
2021-01-18 01:55:57
6个回答
随着带有集合和 splat 运算符的 ES6 的到来(当时仅适用于 Firefox,请查看兼容性表),您可以编写以下神秘的一行代码:
var a = [34, 35, 45, 48, 49];
var b = [48, 55];
var union = [...new Set([...a, ...b])];
console.log(union);
关于这一行的小解释:[...a, ...b]
连接两个数组,你也可以使用a.concat(b)
。new Set()
从中创建一个集合,从而创建您的工会。最后[...x]
将其转换回数组。
如果你不需要保持顺序,并且考虑45
和"45"
是一样的:
function union_arrays (x, y) {
var obj = {};
for (var i = x.length-1; i >= 0; -- i)
obj[x[i]] = x[i];
for (var i = y.length-1; i >= 0; -- i)
obj[y[i]] = y[i];
var res = []
for (var k in obj) {
if (obj.hasOwnProperty(k)) // <-- optional
res.push(obj[k]);
}
return res;
}
console.log(union_arrays([34,35,45,48,49], [44,55]));
如果你使用库下划线,你可以这样写
var unionArr = _.union([34,35,45,48,49], [48,55]);
console.log(unionArr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
我可能在这里浪费时间在一个死线程上。我只需要实现这一点,然后去看看我是否在浪费时间。
我真的很喜欢 KennyTM 的回答。这就是我将如何解决问题。将键合并成一个散列以自然地消除重复项,然后提取键。如果你真的有 jQuery,你可以利用它的优点把它变成一个 2 行问题,然后把它变成一个扩展。jQuery 中的 each() 将负责不迭代 hasOwnProperty() 为 false 的项目。
jQuery.fn.extend({
union: function(array1, array2) {
var hash = {}, union = [];
$.each($.merge($.merge([], array1), array2), function (index, value) { hash[value] = value; });
$.each(hash, function (key, value) { union.push(key); } );
return union;
}
});
请注意,两个原始数组都保持不变。然后你这样称呼它:
var union = $.union(array1, array2);
function unique(arrayName)
{
var newArray=new Array();
label: for(var i=0; i<arrayName.length;i++ )
{
for(var j=0; j<newArray.length;j++ )
{
if(newArray[j]==arrayName[i])
continue label;
}
newArray[newArray.length] = arrayName[i];
}
return newArray;
}
var arr1 = new Array(0,2,4,4,4,4,4,5,5,6,6,6,7,7,8,9,5,1,2,3,0);
var arr2= new Array(3,5,8,1,2,32,1,2,1,2,4,7,8,9,1,2,1,2,3,4,5);
var union = unique(arr1.concat(arr2));
console.log(union);