読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

配列のユニーク化、(unique)

javascript

追記2:concatだと配列のなかに配列が入ってると勝手に展開されて駄目だった。Constellationさんのコメントのコードを使うとその問題も起こらない。
追記:配列の中身に文字列以外が入ってるとうまくいかない。詳しくはコメント参照。
こうするといい。

function uniq(arr)
  Array.reduce(arr,
    function(a, b)
      a.indexOf(b) == -1? a.concat(b): a
    , []);

追記ここまで

前に作ったものよりだいぶ簡潔。たぶん速いんじゃないかと思う。配列風オブジェクトにも使える。

function uniq(arr) {
  var o = {};
  return Array.filter(arr,
    function(i) i in o? false: o[i] = true);
}
uniq([0,1,2,3,4,8,false,null,4,null]); // [0, 1, 2, 3, 4, 8, false, null]

Array.filterはundefined値を無視するので、undefinedを考慮したい場合は下のようにfor文を使う。

function uniq(arr) {
  var o = {},
  r = [];
  for (var i = 0;i < arr.length;i++)
    if (arr[i] in o? false: o[arr[i]] = true)
      r.push(arr[i]);
  return r;
}
uniq([0,1,2,3,4,,8,false,null,,4,null]); // [0, 1, 2, 3, 4, undefined, 8, false, null]

配列のユニーク化はjQueryで、重複したエレメントを取得してしまわないようにするために多用されている。

関連:
Arrayのuniq()を作る - 素人がプログラミングを勉強するブログ
さっきのより高速なuniq()メソッド - 素人がプログラミングを勉強するブログ