我想编写一个函数,它将返回传递的数组参数的并集。
我不想使用递减的while语句和下划线_.union函数。
联盟([1,4,78,98],[45,56,3],[2,3,45]);
返回 - > [1,4,78,98,45,56,2]
这是我到目前为止所做的并且不正确:
union: function(){
var i, j, k;
var newArray = [];
for(i = 0; i < arguments.length; i++){
j = arguments[i];
l = k[arguments[i]];
for (){
j = k[i];
newArray.push(j);
}
}
return newArray;
}
我希望我能找到一个包含多个for循环的解决方案。
答案 0 :(得分:1)
想法是扁平化然后删除重复项。在功能风格中你可以这样做:
function union() {
var arrs = [].concat.apply([], arguments);
return arrs.filter(function(v, i) {
return arrs.indexOf(v) == i;
});
}
这应该会给你与Underscore的union
相同的结果。
答案 1 :(得分:0)
您可以使用.reduce()
。
union([1,4,78,98],[45,56,3],[2,3,45]);
function union() {
return [].reduce.call(arguments, function(res, arr) {
return res.concat(arr.filter(function(item) {
return res.indexOf(item) === -1;
}))
})
}
如果你愿意,可以稍微分解一下:
function union() {
return [].reduce.call(arguments, function(res, arr) {
return res.concat(arr.filter(notIn(res)))
})
}
function notIn(arr) {
return function(item) {
return arr.indexOf(item) === -1;
}
}
当然你也可以重用.reduce()
回调,这样如果你真的有一个数组数组,你可以这样做:
var res = arrays.reduce(joinUnique);
function joinUnique(res, arr) {
return res.concat(arr.filter(notIn(res)))
}
function notIn(arr) {
return function(item) {
return arr.indexOf(item) === -1;
}
}
答案 2 :(得分:0)
最简单的方法是使用Set。
const data = new Set([...[1,4,78,98], ...[45,56,3], ...[2,3,45]]);
data.forEach(i => console.log(i));