1. ホーム
  2. javascript

[解決済み] JavaScriptの配列で一意な値をすべて取得する(重複を排除する)。

2022-03-16 04:52:19

質問

一意であることを確認する必要がある数値の配列があります。インターネットで下記のコードを見つけ、配列にゼロが含まれるまではうまくいきました。そこで この他のスクリプト Stack Overflowのこのページで、ほとんど同じように見えますが、これは失敗しません。

そこで、私の勉強のために、どなたかプロトタイプのスクリプトがどこで間違っているのか判断するのを手伝っていただけないでしょうか。

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

重複している質問の回答をもっと見る。

似たような質問

どのように解決するのですか?

とは JavaScript 1.6 / ECMAScript 5 を使用すると、ネイティブの filter メソッドを使用すると、一意な値を持つ配列を取得できます。

function onlyUnique(value, index, self) {
  return self.indexOf(value) === index;
}

// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter(onlyUnique);

console.log(unique); // ['a', 1, 2, '1']

ネイティブメソッド filter は配列をループし、指定したコールバック関数を通過するエントリのみを残します。 onlyUnique .

onlyUnique は、与えられた値が最初に発生したものであるかどうかをチェックします。もしそうでなければ、それは重複しているはずなので、コピーされません。

この方法は、jQueryやprototype.jsのような追加のライブラリなしで動作します。

値の型が混在する配列にも有効です。

ネイティブメソッドに対応していない古いブラウザ(<ie9)の場合 filterindexOf については、MDNドキュメントで回避策を見つけることができます。 フィルター インデックスオブ .

ある値の最後の出現を保持したい場合は、単に indexOflastIndexOf .

ES6では、これを短縮することができます。

// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i);

console.log(unique); // unique is ['a', 1, 2, '1']

ありがとうございます。 カミロ・マーティン コメントでヒントをいただきました。

ES6では、ネイティブオブジェクト Set を使用して一意な値を格納します。一意な値を持つ配列を得るには、今ならこのようにすればよいでしょう。

var myArray = ['a', 1, 'a', 2, '1'];

let unique = [...new Set(myArray)];

console.log(unique); // unique is ['a', 1, 2, '1']

のコンストラクタは Set は、Array のような反復可能なオブジェクトを受け取り、拡散演算子 ... は、セットを配列に戻す。おかげさまで Lukas Liese コメントでヒントをいただきました。