配列の集合演算を実装する

JavaScript の配列には、集合演算子が無い。仕事で使いそう且つ頭の体操も兼ねて、和集合、差集合、積集合を求めるコードを書いてみた。

//helper method
function include(item, target) {
for (var i = 0, len = target.length; i < len; i++) {
if (item == target[i]) {
return true;
}
}
return false;
}
function union(arrayA, arrayB) {
var result = arrayA.concat();
for (var i = 0, len = arrayB.length; i < len; i++) {
if (!include(arrayB[i], result)) {
result.push(arrayB[i]);
}
}
return result;
}
function difference(arrayA, arrayB) {
var result = [];
for (var i = 0, len = arrayA.length; i < len; i++) {
if (!include(arrayA[i], arrayB)) {
result.push(arrayA[i]);
}
}
return result;
}
function intersection(arrayA, arrayB) {
var result = [];
for (var i = 0, len = arrayB.length; i < len; i++) {
if (include(arrayB[i], arrayA)) {
result.push(arrayB[i]);
}
}
return result;
}

以下、実行結果。ソートされていないが、不具合はなさそうだ。

var a = [1, 2, 3, "a"];
var b = [1, 4, 5, 6, "a", "あ"];
console.log(union(a, b));
//=> [1, 2, 3, "a", 4, 5, 6, "あ"]
console.log(union(b, a));
//=> [1, 4, 5, 6, "a", "あ", 2, 3]
console.log(difference(a, b));
//=> [2, 3]
console.log(difference(b, a));
//=> [4, 5, 6, "あ"]
console.log(intersection(a, b));
//=> [1, "a"]
console.log(intersection(b, a));
//=> [1, "a"]