Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

重複を削除する方法はいくつか方法があるみたいですが、
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 ]
cocottejs
Java,C#,PHPと業務系に携わってきました。最近はnodejsでフレームワークを作成中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away