$.each()
については何も魔法はありません。それは単純な関数であり、必要なものを実行するか、実行しないかのどちらかです。そうでない場合、コード例のように変数を設定することに何も問題はありません。そして、あなたが必要とするものを正確に実行する独自のeach()
関数を書くことに何も問題はありません。これは、ループを実行してコールバック関数を呼び出すほんの数行のコードです。
ここではjQuery 1.10.1で$.each()
のソースコードは次のとおりです。このコードで
// args is for internal usage only
each: function(obj, callback, args) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike(obj);
if (args) {
if (isArray) {
for (; i < length; i++) {
value = callback.apply(obj[ i ], args);
if (value === false) {
break;
}
}
} else {
for (i in obj) {
value = callback.apply(obj[ i ], args);
if (value === false) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if (isArray) {
for (; i < length; i++) {
value = callback.call(obj[ i ], i, obj[ i ]);
if (value === false) {
break;
}
}
} else {
for (i in obj) {
value = callback.call(obj[ i ], i, obj[ i ]);
if (value === false) {
break;
}
}
}
}
return obj;
},
唯一の複雑さは、それはそれらのそれぞれのための2つの異なるケースで、オブジェクトと配列の両方を処理しているという事実から来ています。あなたが扱っているケースでは
、それはつまるところ:あり、その多くのコードがあるだけではない、とあなたがやりたいことしていない場合、あなたは簡単に似た独自のものを書くことができ
for (; i < length; i++) {
value = callback.call(obj[ i ], i, obj[ i ]);
if (value === false) {
break;
}
}
あなたが必要とするものを正確に行うイテレータ。
単純なfor
ループを使用することもできます。
function doExcitingStuff() {
var $elements = $("some-selector-logic");
for(var i = 0; i < $elements.length; i++) {
var $element = $($elements[i]);
if(someLogic($element))
return;
// Otherwise do stuff related to $element
}
someMoreExcitingCode(); // only runs if the loop completes
}
これは本当にすべてがあなたのコードを最もクリーンにするかによって異なります。あなたは$.each()
を使用するか、自分で書くことができます。
私はこの問題を解決するために他の方法に遭遇していません –
なぜあなたは知る必要がありますか?私は個人的にこのような要件に遭遇したことはありません。一見すると、それは臭い/漏れのようになります。多分あなたが取り組んでいるより大きな問題を解決する良い方法があるでしょう。 –
私はあなたがすでに持っているもののバリエーションは、カウンタだと思いますが、すでに持っているものを上回っていることから、それから利点が見えません。 – TGH