直接利用できるコード:スクリプトハウス改訂版
]
以下は高度なチュートリアルであり、詳しく知りたい友人は参照してください。
まず、YUI がどのように処理するかを見てみましょう:
コードは次のとおりです:
var toObject = function(a) {
var o = {};
for (var i = 0; i o[a [i ]] = true;
return o;
var キー = function(o) {
var a=[],
for ( i in o) {
if (lang.hasOwnProperty(o, i)) { // YUI メソッド
a.push(i);
}
}
return a;
};
var uniq = function(a) {
return names(toObject(a));
を参照してください。同僚の Tian が「配列から重複を賢く削除する」を共有しています。
私が使用するメソッドは YUI のメソッドとよく似ていますが、次のように、配列内の重複項目を削除するために 1 つのループのみが使用されます。
var uniq = function (arr) {
var a = [],
o = {},
i,
v,
len = arr.length;
if (len return
}
(i = 0; i v = arr[i]
if (o[v] !== 1) {
a.push(v); >o[ v] = 1;
}
}
return a;
}
使用したメソッドのパフォーマンスYUIよりもはるかに高いです。
より良いソリューションを提供してくださる皆様を歓迎します。
2009 年 12 月 28 日更新:
上記の 2 つの関数メソッドは、当面の間、混合型を含む複雑な配列を処理できません (質問を提起してくれた Mao Mao に感謝します)。[ 0、"0"、1、"1"、0]、["null"、null]。
型が数値 (注: 0 以外で始まる数値、小数点を除く) または文字列であると合意できる配列の場合、改良された関数メソッドを使用できます (closurecache のアイデアのおかげです)。
var a = [ ],
o = {},
i,
v,
cv, // 修正値
len = arr.length;
if ( len return
}
for (i = 0; i v = arr[i]; 🎜>/* Closurecache によって提供される関数は cv = v 0;,
* を使用するため、[1, 10, "1", "10"] のような配列は区別できません。
* は演算 => の後に行われるためです。 1 、10、10、100。明らかに、重複した識別子があります。
*を前に付けても大丈夫でしょうか?
* はい: 0 で始まる 01 や 001 のような数字は配列
* には現れませんが、その適用範囲は以前よりも広くなります。
*/
cv = 0 v;
if (!o[cv]) {
a.push(v) = true; >}
}
return a;
}
この問題解決のアイデアに基づいてより完璧なものにしたい場合は、Dexter.Yy の方法をお勧めします、型判定を実行し、一意の識別子を付与します。詳細は 20 階のコメントを参照してください。
最善の方法はなく、最も適切な方法があるだけです。実際、Array.indexOf() をすでにサポートしているブラウザの場合は、ネイティブの Array.indexOf を使用することも良い選択です。 () メソッドを直接サポートしていないブラウザの場合は、ネイティブの Array.indexOf() メソッドを直接使用します。
のように Array.indexOf() メソッドを追加します。
コードをコピー
コードは次のとおりです。
fromIndex = Math.max(0, this.length) fromIndex);
}
for (var i = fromIndex; i if (this[i] === obj)
return i;
}
return -1;
};
}
次に、実装プロセスは非常に簡単です。
Array.indexOf() メソッドを使用してソリューションを実装するための最適化のヒント: 同じ値が見つかった場合は、それを配列から削除して、次の走査量を減らします。