-1

我想编写一个函数,该函数将返回传递的数组参数的联合。

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

4

3 回答 3

1

这个想法是展平然后删除重复项。在功能样式中,您可以执行以下操作:

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

这应该给你与下划线相同的结果union

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

于 2013-03-02T22:41:53.360 回答
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;
    }
}
于 2013-03-02T22:55:32.820 回答
0

最简单的方法是使用Set

const data = new Set([...[1,4,78,98], ...[45,56,3], ...[2,3,45]]);

data.forEach(i => console.log(i));

于 2016-12-30T16:06:40.630 回答