配列の重複をはじく、もしくは重複を取り出す

  • 265
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

重複を削除する方法はいくつか方法があるみたいですが、
filterを使用する事で非常に楽に実現出来ます

duplicate_check.js
var a = [1,2,3,3,2,2,5];

// 重複を削除したリスト
var b = a.filter(function (x, i, self) {
            return self.indexOf(x) === i;
        });

// 重複のみをリスト
var c = a.filter(function (x, i, self) {
            return self.indexOf(x) !== self.lastIndexOf(x);
        });

// 重複を検出したものを重複しないでリスト
var d = a.filter(function (x, i, self) {
            return self.indexOf(x) === i && i !== self.lastIndexOf(x);
        });

console.log(a); // [ 1, 2, 3, 3, 2, 2, 5 ]
console.log(b); // [ 1, 2, 3, 5 ]
console.log(c); // [ 2, 3, 3, 2, 2 ]
console.log(d); // [ 2, 3 ]

ie8とかで動かないなら、PolyfillでArrayのプロトタイプを拡張してください。

(追記)ES2015対応

この記事も2年半前(2016/2時点)に書かれたもので、古い情報になったきたので、アップデート。
ES2015でも便利な機能も増えてきたので、それを使ってみましょう。
実戦投入は、環境によるので慎重に。

今回は、使用頻度が高い 重複を削除したリストのみを対象に記事を追記してみます
紹介するのは3つ。

  • アロー関数式を使った場合(基本的に処理方法は前のものと同じ)
  • filterの代わりにreduceを使った場合
  • ES2015で追加されたArray.fromとSetを使った場合
duplicate_check2.js
var a = [1,2,3,3,2,2,5];

// アロー関数式
var b1 = a.filter((x, i, self) => self.indexOf(x) === i);

// reduceを使用した場合
var b2 = Object.keys(a.reduce((r, x)=>(r[x]=1, r), {})).map(x=>+x);

// Array.from & Setを使用した場合
var b3 = Array.from(new Set(a));

console.log(b1); // [ 1, 2, 3, 5 ]
console.log(b2); // [ 1, 2, 3, 5 ]
console.log(b3); // [ 1, 2, 3, 5 ]