パフォーマンスのみ!このコードは、ここにあるすべてのコードよりもおそらく10倍速く *すべてのブラウザで機能し、メモリへの影響も最小限です。
古い配列を再利用する必要がない場合は、ここでそれを一意に変換する前に、必要な他の操作を行ってください。これはおそらくこれを行う最も速い方法ですが、これも非常に短い方法です。
var array=[1,2,3,4,5,6,7,8,9,0,1,2,1];
その後、これを試すことができます
var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 1];
function toUnique(a, b, c) { //array,placeholder,placeholder
b = a.length;
while (c = --b)
while (c--) a[b] !== a[c] || a.splice(c, 1);
return a // not needed ;)
}
console.log(toUnique(array));
//[3, 4, 5, 6, 7, 8, 9, 0, 2, 1]
私はこの記事を読んでこの機能を思いつきました...
http://www.shamasis.net/2009/09/fast-algorithm-to-find-unique-items-in-javascript-array/
forループは好きではありません。多くのパラメータが必要です。whileループと同じです。whileは、すべてのブラウザで最も高速なループです。
とにかく、whileを使用する最初の関数を作成しました。そうです、記事にある関数よりも少し高速ですが、十分ではありません。unique2()
次のステップでは、モダンなjsを使用します。Object.keys
私はもう一方のforループをjs1.7のObject.keysに置き換えました...少し速くて短い(クロムでは2倍速い);)。十分ではない!。unique3()
。
この時点で、私のユニークな機能に本当に必要なものについて考えていました。古い配列は必要ありません。高速な関数が必要です。したがって、2つのwhileループ+スプライスを使用しました。unique4()
感動したと言ってもダメ。
クロム:通常の1秒あたり150,000オペレーションは、1秒あたり1,800,000オペレーションにジャンプしました。
つまり、 80,000 op / s対3,500,000 op / s
iOS: 18,000 op / s対170,000 op / s
サファリ: 80,000オペレーション/秒vs 6,000,000オペレーション/秒
証明
http://jsperf.com/wguまたはより適切にconsole.time ... microtime ...を使用してください
unique5()
古い配列を保持したい場合にどうなるかを示すだけです。
あなたArray.prototype
が何をしているかわからない場合は使用しないでください。たくさんのコピーと過去をやりました。Object.defineProperty(Array.prototype,...,writable:false,enumerable:false})
ネイティブプロトタイプを作成する場合に使用します。例:https : //stackoverflow.com/a/20463021/2450730
デモ
http://jsfiddle.net/46S7g/
注:この操作の後、古いアレイは破棄されるか、固有のものになります。
上記のコードが読めない場合は、javascriptの本を読んでください。短いコードについての説明もいくつかあります。https://stackoverflow.com/a/21353032/2450730
一部は使用indexOf
しています... 使用しない... http://jsperf.com/dgfgghfghfghghgfhgfhfghfhgfh
空の配列の場合
!array.length||toUnique(array);