2014-12-23 38 views
2

我有2个阵列可以说:JavaScript数组在执行一套计算

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)。

在此先感谢。

+0

既然你不能使用一个外部库,看来你将不得不依赖于大量原始for循环或写你自己的小图书馆。无论哪种方式,你都会使用for循环。希望这不是功课。 – dotnetN00b

+0

不,这不是作业相关的作业,我不想为我们的SVN项目添加整个外部库,仅用于3行代码。我可以想办法得到我想要的结果,我只是想在这里问一个更优雅的解决方案。另外我还没有必要在数组中使用集合论,所以我认为在这里学习一些东西以备后用是个好主意。 – Konstantine

回答

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; 
 
    } 
 
); 
 
}

+0

这看起来确实如此。也没有图书馆! – Konstantine

+0

这是我喜欢被证明是错误的时代。 – dotnetN00b

2

由于ES6的,JavaScript有一个inbuilt 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);