LoginSignup
518

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-09-10

重複を削除する方法はいくつか方法があるみたいですが、
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 ]

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
518