複数のアレイから重複を一度に削除する


5

この(機能する)コードは、重複としてマークされていない両方配列の要素で構成される新しい配列を返すことになっています(両方の配列で重複を見つけ、そのような要素を両方から削除します配列し、もしあれば、残り物から配列を作成する

この機能を簡略化する方法はありますか?

function diff(arr1, arr2) {
    var arr1_filtered, arr2_filtered;

    arr1_filtered = arr1.filter(function (v) {
        return arr2.indexOf(v) == -1;
    });

    arr2_filtered = arr2.filter(function (v) {
        return arr1.indexOf(v) == -1;
    });

    return arr1_filtered.concat(arr2_filtered);
}
2

Create a function on Array.prototype that'll accept an array and filter the array by checking if the element is in the other array.

// Define a function on Array prototype
Array.prototype.arrayDiff = function (arr) {
    return this.filter(function (v) {
        return arr.indexOf(v) === -1;
    });
};

function diff(arr1, arr2) {
    // 1. Remove elements that are in arr2 from arr1
    //    i.e. arr1.arrayDiff(arr2)
    // 2. Remove elements that are in arr1 from arr2
    //    i.e. arr2.arrayDiff(arr1)
    // 3. Concat the result of both the arrays

    return arr1.arrayDiff(arr2).concat(arr2.arrayDiff(arr1));
}

// Define a function on Array prototype
Array.prototype.removeDuplicates = function(arr) {
  return this.filter(function(v) {
    return arr.indexOf(v) === -1;
  });
};

function diff(arr1, arr2) {
  return arr1.removeDuplicates(arr2).concat(arr2.removeDuplicates(arr1));
}

var arr = diff([1, 3, 4, 2, 5], [2, 45, 7, 42, 1, 6]);
document.write(JSON.stringify(arr));