これは、オブジェクトを取得するために記述できる最短のコードである可能性があります。
// your existing code (a tiny bit changed)
var idArray = $("*[id]").map(function() {
return this.id;
}).get();
// this one liner does the trick
var obj = $.extend({}, idArray);
あなたの問題に対するより良いアプローチ-連想配列
しかし、他の回答であなたのコメントを読んだように、このオブジェクト構造はあなたの場合には最適ではないかもしれません。特定のIDがすでに存在するかどうかを確認する必要があります。このオブジェクト
{
0: "ID1",
1: "otherID",
...
}
あまり役に立ちません。より良いオブジェクトは、連想配列オブジェクトです。
{
ID1: true,
otherID: true,
...
}
if
これは、ステートメントでこの条件を使用してチェックするだけで、特定のIDを簡単に判別できるためです。
if (existingIDs[searchedID]) ...
存在しないすべてのIDはこの条件に失敗し、存在するすべてのIDはを返しtrue
ます。ただし、IDの配列をこのオブジェクトに変換するには、次のコードを使用する必要があります。
// your existing code (a tiny bit changed)
var idArray = $("*[id]").map(function() {
return this.id;
}).get();
// convert to associative "array"
var existingIDs = {};
$.each(idArray, function() { existingIDs[this] = true; });
または、必要な結果が得られたら、これをもう少し最適化できます。
var existingIDs = {};
$("*[id]").each(function() { existingIDs[this.id] = true; });
これにより、既存のID検索が最大限に高速化されます。O(1)にIDが存在することに関する情報を取得できる限り、IDの一意性をチェックするために階層オブジェクト構造は必要ない可能性があります。上位の連想配列オブジェクトは、この超高速の可能性を提供します。また、新しいIDで新しいオブジェクトを作成する場合は、次のようにするだけで、既存の連想配列オブジェクトに簡単に追加できます。
existingIDs[newID] = true;
以上です。新しいIDは、同じ連想配列オブジェクトに他のIDと一緒にキャッシュされます。
注意:あなたのコードがグローバル(listy
変数)を暗示していることがわかります。注意して、可能であれば避けてください。
性能試験
@Blazemongerが示唆しているように、これは水を保持しないので、この主張は真実かもしれないと思います。要約すると、次のようになります。
- あなたが持っているIDを持つ要素の数
- やりたい検索の数
最初のページが通常IDよりもCSSクラスが頻繁に使用される通常のHTMLページのように低く、2番目のページが十分に大きい場合、このパフォーマンステストは、連想配列がjQueryを単独で使用するよりもかなり高速であることを証明します。このテストで使用されるHTMLは、モバイルサイトでのStackoverflowの質問リストのコピーです(したがって、ソースからスクリプトを削除する作業が少なくなりました)。私は、どちらかのソリューションを優先するように意図的に製造できる準備されたテストケースよりも、実際のサイトコンテンツの例を意図的に取り上げました。
はるかに小さなスケールで検索している場合は、単純なjQueryを使用するよりも高速です。これは、起動時の連想配列の準備を必要とせず、すぐに検索を終了するためです。