JavaScript 配列内のすべての一意の値を取得する (重複を削除) [重複] 質問する

JavaScript 配列内のすべての一意の値を取得する (重複を削除) [重複] 質問する

一意であることを確認する必要がある数値の配列があります。インターネットで以下のコードスニペットを見つけましたが、配列にゼロが含まれるまではうまく機能します。この他のスクリプト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;
}

ベストアンサー1

JavaScript 1.6 / ECMAScript 5ではネイティブのfilter配列のメソッドを次のように使用して、一意の値を持つ配列を取得します。

function onlyUnique(value, index, array) {
  return array.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)ではネイティブメソッドをサポートしていませんfilterが、indexOfMDNドキュメントで回避策を見つけることができます。フィルターそしての指標

最後に出現した値を保持する場合は、indexOfを に置き換えるだけですlastIndexOf

ES6 では、次のように短縮できます。

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

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配列のような反復可能なオブジェクトを受け取り、スプレッド演算子...はセットを配列に戻します。ルーカス・リーゼコメント内のヒント。

おすすめ記事