我有 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)。
提前致谢。
我有 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)。
提前致谢。
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;
}
);
}
从 ES6 开始,Javascript 有一个内置的 set 对象,它提供了执行上述操作的简洁方法。
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);