-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 に答える