Ответы:
(Обновление: в моем другом ответе здесь изложены параметры, не относящиеся к jQuery, гораздо более подробно. Третий вариант, приведенный ниже, jQuery.each
не включен в него.)
Четыре варианта:
var i;
for (i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
или в ES2015 +:
for (let i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
Преимущества : простота, нет зависимости от jQuery, легко понять, нет проблем с сохранением смысла this
внутри тела цикла, нет ненужных накладных расходов на вызовы функций (например, теоретически быстрее, хотя на самом деле вам придется есть так много элементов, что, скорее всего, у вас возникнут другие проблемы; детали ).
forEach
:Начиная с ECMAScript5, у массивов есть forEach
функция, которая упрощает цикл по массиву:
substr.forEach(function(item) {
// do something with `item`
});
(Примечание. Существует множество других функций, а не только forEach
; подробности см. В ответе, указанном выше ).
Преимущества : Декларативная, может использовать предварительно созданную функцию для итератора, если у вас есть один удобный способ, если ваше тело цикла сложное, иногда полезна область видимости вызова функции, нет необходимости в i
переменной в содержащейся области.
Недостатки : если вы используете this
в содержащем коде и хотите использовать его this
в forEach
обратном вызове, вы должны либо: A) вставить его в переменную, чтобы вы могли использовать его в функции, B) передать его в качестве второго аргумента, forEach
чтобы forEach
устанавливает его как this
во время обратного вызова, или C) Используйте функцию стрелки ES2015 + , которая закрывается this
. Если вы не сделаете одну из этих вещей, в обратном вызове this
будет undefined
(в строгом режиме) или глобальный объект ( window
) в свободном режиме. Раньше был второй недостаток, который forEach
не был универсально поддержан, но здесь, в 2018 году, единственный браузер, с которым вы столкнетесь, не имеет forEach
IE8 (и он не может быть должным образом там тоже заполнены).
for-of
:for (const s of substr) { // Or `let` if you want to modify it in the loop body
// do something with `s`
}
См. Ответ в верхней части этого ответа, чтобы узнать, как это работает.
Преимущества : Простой, простой, предлагает переменную автономной области (или константу, как указано выше) для записи из массива.
Недостатки : не поддерживается ни в одной версии IE.
jQuery.each(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
Преимущества : все те же преимущества, что forEach
и плюс, вы знаете, что он есть, поскольку вы используете jQuery.
Недостатки : если вы используете this
в содержащем коде, вы должны вставить его в переменную, чтобы вы могли использовать его внутри функции, поскольку это this
означает что-то еще внутри функции.
Вы можете избежать этого this
, используя $.proxy
:
jQuery.each(substr, $.proxy(function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}, this));
... или Function#bind
:
jQuery.each(substr, function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}.bind(this));
... или в ES2015 ("ES6") функция стрелки:
jQuery.each(substr, (index, item) => {
// do something with `item` (`this` is the same as it was outside)
});
Не используйте for..in
для этого (или, если вы делаете, сделайте это с надлежащими мерами предосторожности). Вы увидите, что люди говорят (на самом деле, кратко, здесь был ответ, говорящий об этом), но for..in
не делает то, что думают многие люди (это делает что-то еще более полезное!). В частности, for..in
проходит через перечисляемые имена свойств объекта (не индексы массива). Поскольку массивы являются объектами, а их единственными перечислимыми свойствами по умолчанию являются индексы, в основном это похоже на работу в обычном развертывании. Но это не безопасное предположение, что вы можете просто использовать его для этого. Вот исследование: http://jsbin.com/exohi/3
Я должен смягчить «не» выше. Если вы имеете дело с разреженными массивами (например, в массиве всего 15 элементов, но их индексы по какой-то причине разбросаны по диапазону от 0 до 150 000, и поэтому length
это 150 001), и если вы используете соответствующие защитные меры, такие как hasOwnProperty
и проверка имя свойства действительно числовое (см. ссылку выше), for..in
может быть вполне разумным способом избежать множества ненужных циклов, так как будут перечислены только заполненные индексы.
Function#bind
. :-) Хороший вопрос, добавил.
i++
и ++i
является результатом этого выражения, которое никогда не используется в приведенном выше примере. for
Цикл работает следующим образом: 1. Инициализация, 2. Тест (прекращается , если ложь), 3. Тело, 4. Обновление, 5. Возврат к шагу 2. Результат выражения обновления не используется ни для чего.
jQuery.each(array, callback)
итерация массива
jQuery.each(array, function(Integer index, Object value){});
итерация объекта
jQuery.each(object, function(string propertyName, object propertyValue){});
пример :
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>
для цикла
for (initialExpression; condition; incrementExpression)
statement
пример
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])
}
для в
//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
}
для из
for(var i of subs) {
//can use break;
console.log(i); //note i returns value
}
для каждого
substr.forEach(function(v, i, a){
//cannot use break;
console.log(v, i, a);
})
Здесь нет необходимости в jquery, просто работает for
цикл:
var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
alert(substr[i]);
}
for
петляТрадиционный for
-loop имеет три компонента:
Эти три компонента отделены друг от друга ;
символом. Содержимое для каждого из этих трех компонентов является необязательным, что означает, что следующее является самым минимальным for
возможным циклом:
for (;;) {
// Do stuff
}
Конечно, вам нужно будет включить if(condition === true) { break; }
или if(condition === true) { return; }
где-то внутри этого for
-loop, чтобы заставить его перестать работать.
Обычно, однако, инициализация используется для объявления индекса, условие используется для сравнения этого индекса с минимальным или максимальным значением, а запоздалая мысль используется для увеличения индекса:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
for
-loop для обхода массиваТрадиционный способ перебрать массив, это:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
Или, если вы предпочитаете цикл в обратном направлении, вы делаете это:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
Однако возможны многие варианты, например, например. вот этот :
for (var key = 0, value = myArray[key], var length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
... или этот ...
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
... или этот:
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
То, что работает лучше всего, в значительной степени зависит как от личного вкуса, так и от конкретного варианта использования, который вы реализуете.
Примечание :Каждый из этих вариантов поддерживается всеми браузерами, включая самые старые!
while
-петлОдной альтернативой for
-loop является while
-loop. Чтобы перебрать массив, вы можете сделать это:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
Примечание :
Как и традиционные for
-loops, while
-loops поддерживаются даже в самых старых браузерах.
Кроме того, каждый цикл while может быть переписан как for
-loop. Например, while
-loop здесь ведет себя точно так же, как этот for
-loop:
for(var key = 0;value = myArray[key++];){
console.log(value);
}
for...in
иfor...of
В JavaScript вы также можете сделать это:
for (i in myArray) {
console.log(myArray[i]);
}
Однако это следует использовать с осторожностью, поскольку for
во всех случаях он ведет себя не так, как традиционная петля, и существуют потенциальные побочные эффекты, которые необходимо учитывать. См. Почему использование «for ... in» с итерацией массива - плохая идея? Больше подробностей.
Как альтернатива for...in
, теперь есть и для for...of
. В следующем примере показана разница между for...of
циклом и 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
}
Примечание :
Вы также должны учитывать, что ни одна версия Internet Explorer не поддерживает for...of
( Edge 12+ ) и for...in
требует как минимум IE10.
Array.prototype.forEach()
Альтернативой For
-loops является Array.prototype.forEach()
следующий синтаксис:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
Примечание :
Array.prototype.forEach()
поддерживается всеми современными браузерами, а также IE9 +.
jQuery.each()
В дополнение к четырем другим упомянутым опциям, у jQuery также была своя foreach
вариация.
Он использует следующий синтаксис:
$.each(myArray, function(key, value) {
console.log(value);
});
Используйте each()
функцию jQuery.
Вот пример:
$.each(currnt_image_list.split(','), function(index, value) {
alert(index + ': ' + value);
});
Используйте jQuery each()
. Есть и другие способы, но каждый предназначен для этой цели.
$.each(substr, function(index, value) {
alert(value);
});
И не ставьте запятую после последнего номера.
Синтаксис ES6 с функцией стрелки и интерполяцией:
var data=["a","b","c"];
$(data).each((index, element) => {
console.log(`current index : ${index} element : ${element}`)
});
Попробуй это:
$.grep(array, function(element) {
})
Альтернативные способы итерации по массиву / строке с побочными эффектами
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()
илиfor...in
для циклического перебора массива вообще плохая идея. Это как возрасты медленнее, чем использованиеfor
илиwhile
. Используяfor loop
это даже отличная идея для кэшированияlength
свойства перед циклом.for (var i = 0, len = substr.length; i < len; ...