Javascript:多个参数的联合

时间:2013-03-02 22:35:52

标签: javascript for-loop

我想编写一个函数,它将返回传递的数组参数的并集。

我不想使用递减的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循环的解决方案。

3 个答案:

答案 0 :(得分:1)

想法是扁平化然后删除重复项。在功能风格中你可以这样做:

function union() {
  var arrs = [].concat.apply([], arguments);
  return arrs.filter(function(v, i) {
    return arrs.indexOf(v) == i;
  });
}

这应该会给你与Underscore的union相同的结果。

演示: http://jsbin.com/azulok/1/edit

答案 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));