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"]