Yanıtlar:
(Güncelleme: Buradaki diğer cevabım jQuery olmayan seçenekleri çok daha ayrıntılı bir şekilde ortaya koyuyor. Aşağıdaki üçüncü seçenek jQuery.each
, bunun içinde değil.)
Dört seçenek:
var i;
for (i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
veya ES2015 + 'da:
for (let i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
Avantajları : Düz ileri, jQuery'ye bağımlılık yok, anlaşılması kolay this
, döngü gövdesinin anlamını koruma ile ilgili hiçbir sorun yok, işlev çağrılarının gereksiz ek yükü yok (örneğin, teoride daha hızlı, ancak aslında O kadar çok unsurunuz var ki, olasılıklar başka problemleriniz olacaktır; ayrıntılar ).
forEach
:ECMAScript5'ten itibaren, dizilerin forEach
üzerinde dizi arasında döngü yapmayı kolaylaştıran bir işlevi vardır:
substr.forEach(function(item) {
// do something with `item`
});
(Not: Sadece pek çok başka işlev de vardır forEach
; ayrıntılar için yukarıda belirtilen yanıta bakın.)
Avantajları : Bildirici, kullanışlı bir tane varsa, yineleyici için önceden oluşturulmuş bir işlevi kullanabilir, döngü gövdeniz karmaşıksa, bir işlev çağrısının kapsamı bazen yararlıdır, i
kapsama alanınızdaki bir değişkene gerek yoktur .
Dezavantajları : Eğer this
içeren kodu kullanıyorsanız ve geri arama this
içinde kullanmak forEach
istiyorsanız, A) bir değişkene yapıştırmanız gerekir, böylece fonksiyon içinde kullanabilirsiniz, B) Bunu ikinci bir argüman olarak forEach
geçirin. forEach
setler de this
Geri arama sırasında ya da C) bir ES2015 + kullanma işlevi ok fazla kapanır, this
. Eğer bu şeylerden birini yapmazsanız, geri dönüşünde yer this
olacak undefined
veya global nesne ((katı modda) window
gevşek modunda). Eskiden forEach
evrensel olarak desteklenmeyen ikinci bir dezavantaj vardı , ancak burada 2018'de karşılaşacağınız tek tarayıcı forEach
IE8 değil (ve düzgün bir şekilde olamaz) orada çok doldurulmuş).
for-of
:for (const s of substr) { // Or `let` if you want to modify it in the loop body
// do something with `s`
}
Bunun nasıl çalıştığına ilişkin ayrıntılar için bu cevabın üst kısmındaki bağlantıya bakın.
Avantajları : Basit, anlaşılır, diziden giriş için içerilen bir kapsam değişkeni (veya yukarıda sabit) sunar.
Dezavantajları : IE'nin hiçbir sürümünde desteklenmez.
jQuery.each(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
Avantajları : forEach
jQuery kullandığınızdan beri aynı avantajları da biliyorsunuz.
Dezavantajları : Eğer this
içeren kodda kullanıyorsanız, onu fonksiyon içinde kullanabilmeniz için bir değişkene yapıştırmanız gerekir, çünkü this
fonksiyon içinde başka bir şey ifade eder.
this
Yine de, aşağıdakilerden birini kullanarak bir şeyden kaçınabilirsiniz $.proxy
:
jQuery.each(substr, $.proxy(function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}, this));
... veya Function#bind
:
jQuery.each(substr, function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}.bind(this));
... veya ES2015'te ("ES6") bir ok işlevi:
jQuery.each(substr, (index, item) => {
// do something with `item` (`this` is the same as it was outside)
});
Bunun için kullanmayın for..in
(ya da yaparsanız, uygun önlemlerle yapın). İnsanların söylediklerini göreceksiniz (aslında, kısaca bunu söyleyen bir cevap vardı), ancak for..in
birçok insanın düşündüğünü yapmaz (daha kullanışlı bir şey yapar!). Özellikle, for..in
bir nesnenin numaralandırılabilir özellik adlarında dolaşır (bir dizinin dizinlerini değil). Diziler nesneler olduğundan ve varsayılan olarak yalnızca numaralandırılabilen özellikleri dizinler olduğundan, çoğunlukla yumuşak bir dağıtımda bir tür iş gibi görünüyor. Ancak bunun için kullanabileceğiniz güvenli bir varsayım değildir. İşte bir keşif: http://jsbin.com/exohi/3
Yukarıdaki "yapma" yumuşamalı. Seyrek diziler ediyoruz uğraşan Eğer varsa (örneğin, dizi toplam 15 element vardır ama onların endeksleri nedense 150,000 aralığında 0 dört bir yanına atılan ve bu yüzden length
150.001 olan), ve sen gibi uygun önlemleri kullanırsanız hasOwnProperty
ve denetleme özellik adı gerçekten sayısaldır (yukarıdaki bağlantıya bakın), for..in
çok sayıda gereksiz döngüden kaçınmak için mükemmel makul bir yol olabilir, çünkü yalnızca doldurulmuş dizinler numaralandırılacaktır.
Function#bind
. :-) İyi bir nokta, eklendi.
i++
ve arasındaki tek farktır ++i
. Bir for
döngü şu şekilde çalışır: 1. Başlatma, 2. Test (yanlışsa sonlandır), 3. Gövde, 4. Güncelleme, 5. Adım 2'ye dönün. Güncelleme ifadesinin sonucu hiçbir şey için kullanılmaz.
jQuery.each(array, callback)
dizi yinelemesi
jQuery.each(array, function(Integer index, Object value){});
nesne yinelemesi
jQuery.each(object, function(string propertyName, object propertyValue){});
örnek :
var substr = [1, 2, 3, 4];
$.each(substr , function(index, val) {
console.log(index, val)
});
var myObj = { firstName: "skyfoot"};
$.each(myObj, function(propName, propVal) {
console.log(propName, propVal);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
döngü için
for (initialExpression; condition; incrementExpression)
statement
misal
var substr = [1, 2, 3, 4];
//loop from 0 index to max index
for(var i = 0; i < substr.length; i++) {
console.log("loop", substr[i])
}
//reverse loop
for(var i = substr.length-1; i >= 0; i--) {
console.log("reverse", substr[i])
}
//step loop
for(var i = 0; i < substr.length; i+=2) {
console.log("step", substr[i])
}
için
//dont really wnt to use this on arrays, use it on objects
for(var i in substr) {
console.log(substr[i]) //note i returns index
}
için
for(var i of subs) {
//can use break;
console.log(i); //note i returns value
}
her biri için
substr.forEach(function(v, i, a){
//cannot use break;
console.log(v, i, a);
})
Burada jquery gerek yok, sadece bir for
döngü çalışır:
var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
alert(substr[i]);
}
for
döngüGeleneksel bir for
döngü üç bileşene sahiptir:
Bu üç bileşen bir ;
sembol ile birbirinden ayrılır . Bu üç bileşenin her biri için içerik isteğe bağlıdır, yani aşağıdakiler mümkün olan en düşük for
döngüdür:
for (;;) {
// Do stuff
}
Tabii ki, çalışmayı durdurmak için bu döngüye bir if(condition === true) { break; }
veya bir yer eklemeniz gerekecek .if(condition === true) { return; }
for
Genellikle, başlatma işlemi bir dizin bildirmek için kullanılır, koşul bu dizini minimum veya maksimum değerle karşılaştırmak için kullanılır ve sonradan gelenler dizini artırmak için kullanılır:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
for
Bir dizi arasında döngü oluşturmak için bir tradtional -loop kullanmaBir dizide döngü yapmanın geleneksel yolu şudur:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
Veya, geriye doğru döngü yapmayı tercih ederseniz, bunu yaparsınız:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
Bununla birlikte, örn. Bu :
for (var key = 0, value = myArray[key], var length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
... ya da bu ...
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
... ya da bu :
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
Hangisi daha iyi çalışıyorsa, büyük ölçüde hem kişisel zevkiniz hem de uyguladığınız özel kullanım durumu meselesidir.
Not :Bu varyasyonların her biri, eski tarayıcılar da dahil olmak üzere tüm tarayıcılar tarafından desteklenir!
while
-döngüfor
--Döngüsünün bir alternatifi-- while
Döngü'dür. Bir dizi arasında döngü yapmak için şunları yapabilirsiniz:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
Not :
Geleneksel- for
döngüler gibi, while
-döngüler en eski tarayıcılar tarafından bile desteklenir.
Ayrıca, while while döngüsü bir for
-loop olarak yeniden yazılabilir . Örneğin, while
-loop hereabove bu for
-loop ile aynı şekilde davranır :
for(var key = 0;value = myArray[key++];){
console.log(value);
}
for...in
vefor...of
JavaScript'te şunları da yapabilirsiniz:
for (i in myArray) {
console.log(myArray[i]);
}
Bununla birlikte, for
tüm durumlarda traditonal bir döngü ile aynı şekilde davranmadığı ve göz önünde bulundurulması gereken potansiyel yan etkiler olduğu için bu dikkatle kullanılmalıdır. Bkz "in için ..." Neden kullanıyor diziye yineleme kötü bir fikir ile? daha fazla ayrıntı için.
Alternatif olarak for...in
, şimdi de var for...of
. Aşağıdaki örnek, bir for...of
döngü ile döngü arasındaki farkı gösterir for...in
:
var myArray = [3, 5, 7];
myArray.foo = "hello";
for (var i in myArray) {
console.log(i); // logs 0, 1, 2, "foo"
}
for (var i of myArray) {
console.log(i); // logs 3, 5, 7
}
Not :
Ayrıca, Internet Explorer'ın hiçbir sürümünün for...of
( Edge 12+ desteklemediğini) desteklemediğini ve for...in
en az IE10 gerektirdiğini düşünmeniz gerekir.
Array.prototype.forEach()
Aşağıdaki sözdizimini kullanan For
-loops seçeneğine bir alternatif Array.prototype.forEach()
:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
Not :
Array.prototype.forEach()
IE9 + 'nın yanı sıra tüm modern tarayıcılar tarafından desteklenmektedir.
jQuery.each()
Bahsedilen diğer dört seçeneğe ek olarak, jQuery'nin de kendi foreach
varyasyonu vardı .
Aşağıdaki sözdizimini kullanır:
$.each(myArray, function(key, value) {
console.log(value);
});
each()
JQuery işlevini kullanın .
İşte bir örnek:
$.each(currnt_image_list.split(','), function(index, value) {
alert(index + ': ' + value);
});
JQuery kullanın each()
. Başka yollar var ama her biri bu amaç için tasarlandı.
$.each(substr, function(index, value) {
alert(value);
});
Ve son sayıdan sonra virgül koymayın.
Ok fonksiyonu ve enterpolasyonlu ES6 sözdizimi:
var data=["a","b","c"];
$(data).each((index, element) => {
console.log(`current index : ${index} element : ${element}`)
});
Bunu dene:
$.grep(array, function(element) {
})
Yan etkilerle dizi / dize ile alternatif yineleme yolları
var str = '21,32,234,223';
var substr = str.split(',');
substr.reduce((a,x)=> console.log('reduce',x), 0) // return undefined
substr.every(x=> { console.log('every',x); return true}) // return true
substr.some(x=> { console.log('some',x); return false}) // return false
substr.map(x=> console.log('map',x)); // return array
str.replace(/(\d+)/g, x=> console.log('replace',x)) // return string
.each()
yafor...in
dizisi üzerinde döngüye genel kötü bir fikir olduğunu. Tıpkıfor
veya kullanmaktan daha yavaş yaşlar gibiwhile
.for loop
Bunu kullanarak ,length
döngüden önce özelliği önbelleğe almak harika bir fikirdir .for (var i = 0, len = substr.length; i < len; ...