一意であることを確認する必要がある数値の配列があります。インターネットで以下のコードスニペットを見つけましたが、配列にゼロが含まれるまではうまく機能します。この他のスクリプト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
が、indexOf
MDNドキュメントで回避策を見つけることができます。フィルターそしての指標。
最後に出現した値を保持する場合は、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
配列のような反復可能なオブジェクトを受け取り、スプレッド演算子...
はセットを配列に戻します。ルーカス・リーゼコメント内のヒント。