2

私は2つの配列を持っています:

A = [1,2,3,4,5] and B = [1,2,3,6,7]

そして、次の「セット計算」を実行したいと思います。

C = (A ∩ B)
D = A - (A ∩ B)
E = B - (A ∩ B)

基本的に:

C = [1,2,3]
D = [4,5]
E = [6,7]

これを行うスマートな方法はありますか、それとも各配列メンバーをループと ifs でクロスチェックする必要がありますか? 外部ライブラリ (math.js や w/e など) を使用できません。

前もって感謝します。

4

2 に答える 2

5

filter()少なくともループを隠すことができます:

A = [1,2,3,4,5];
B = [1,2,3,6,7];

C = intersection(A, B);
D = arrayDiff(A, C);
E = arrayDiff(B, C);

console.log(JSON.stringify(C));
console.log(JSON.stringify(D));
console.log(JSON.stringify(E));

function intersection(a, b) {
  return a.filter( 
    function(el) {
      return b.indexOf(el) >= 0;
    }
  );
}

function arrayDiff(a, b) {
  return a.filter( 
    function(el) {
      return b.indexOf(el) < 0;
    }
  );
}

于 2014-12-23T15:26:18.980 に答える
3

ES6 の時点で、Javascript には組み込みの set objectがあり、上記の操作を行うための優れた方法を提供します。

var intersection = function(setA, setB){
  return new Set([x for (x of setA) if (setB.has(x))]);
}
var difference = function(setA, setB){
  return new Set([x for (x of setA) if (!setB.has(x))]);
}
A = new Set([1,2,3,4,5]);
B = new Set([1,2,3,6,7]);

// A ∩ B = ([1,2,3])
intersection(A, B);

// A \ B = ([4,5])
difference(A, B);

// B \ A = ([6,7])
difference(B, A);

于 2015-12-08T19:53:17.387 に答える