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