- I. Перебір реальних масивів
- Метод forEach і споріднені методи
- Цикл for
- Правильне використання циклу for...in
- Цикл for...of (неявне використання ітератора)
- Явне використання ітератора
- Використання способів перебору справжніх масивів
- Перетворення на справжній масив
- Зауваження щодо об'єктів середовища виконання
Приклад використання:
var a = ["a", "b", "c"]; a.forEach(function(entry) ( console.log(entry); ));
У загальному випадку використання forEach вимагає підключення бібліотеки емуляції es5-shim для браузерів, які не мають нативної підтримки цього методу. До них відносяться IE 8 і більше ранні версії, які досі де-не-де ще використовуються.
До переваг дляEach відноситься те, що тут не потрібно оголошувати локальні змінні для зберігання індексу та значення поточного елемента масиву, оскільки вони автоматично передаються у функцію зворотного виклику (колбек) як аргументи.
Якщо вас турбують можливі витрати на виклик колбека для кожного елемента, не хвилюйтеся та прочитайте це.
ForEach призначений для перебору всіх елементів масиву, але крім нього ES5 пропонує ще кілька корисних методів для перебору всіх або деяких елементів плюс виконання при цьому будь-яких дій з ними:
- every - повертає true, якщо для кожного елемента масиву колбек повертає значення, що приводиться до true.
- some-повертає true, якщо хоча б для одного елемента масиву колбек повертає значення, що приводиться до true.
- filter - створює новий масив, що включає елементи вихідного масиву, для яких колбек повертає true .
- map - створює новий масив, що складається з значень колбеком, що обертаються.
- reduce - зводить масив до єдиного значення, застосовуючи колбек по черзі до кожного елемента масиву, починаючи з першого (може бути корисним для обчислення суми елементів масиву та інших підсумкових функцій).
- reduceRight – працює аналогічно reduce, але перебирає елементи у зворотному порядку.
Var a = ["a", "b", "c"]; var index; for (index = 0; index< a.length; ++index) {
console.log(a);
}
Якщо довжина масиву незмінна протягом усього циклу, а сам цикл належить критичній у плані продуктивності ділянці коду (що малоймовірно), то можна використовувати більш оптимальну версію for зі зберіганням довжини масиву:
Var a = ["a", "b", "c"]; var index, len; for (index = 0, len = a.length; index< len; ++index) {
console.log(a);
}
Теоретично цей код має виконуватися трохи швидше, ніж попередній.
Якщо порядок перебору елементів не важливий, то можна піти ще далі в плані оптимізації та позбутися змінної для зберігання довжини масиву, змінивши порядок перебору на зворотний:
Var a = ["a", "b", "c"]; var index; for (index = a.length - 1; index >= 0; --index) ( console.log(a); )
Тим не менш, у сучасних движках JavaScript подібні ігри з оптимізацією зазвичай нічого не означають.
Тим не менш, у деяких випадках, таких як перебір розріджених масивів , for ... in може виявитися корисним, якщо тільки дотримуватися при цьому запобіжних заходів, як показано в прикладі нижче:
// a - розріджений масив var a =; a = "a"; a = "b"; a = "c"; for (var key in a) ( if (a.hasOwnProperty(key) && /^0$|^\d*$/.test(key) && key 0) ( result = true; ) return result; ); var passed = numbers.every(condition); document.write(passed); // false
У метод every() як параметр передається функція, що представляє умову. Ця функція приймає три параметри:
Function condition(value, index, array) ( )
Параметр value представляє поточний елемент масиву, що перебирається, параметр index представляє індекс цього елемента, а параметр array передає посилання на масив.
У цій функції ми можемо перевірити передане значення елемента на відповідність будь-якій умові. Наприклад, у цьому прикладі ми перевіряємо кожен елемент масиву, чи більше він нуля. Якщо більше, то повертаємо значення true, тобто елемент відповідає умові. Якщо менше, то повертаємо false – елемент не відповідає умові.
У результаті, коли відбувається виклик методу numbers.every (condition), він перебирає всі елементи масиву numbers і по черзі передає їх у функцію condition. Якщо ця функція повертає значення true для всіх елементів, то метод every() повертає true . Якщо хоча б один елемент відповідає умові, то метод every() повертає значення false .
some()Метод some() схожий метод every() , тільки він перевіряє, чи відповідає хоча б один елемент умові. І тут метод some() повертає true . Якщо елементів, що відповідають умові, у масиві немає, то повертається значення false:
Var numbers = [1, -12, 8, -4, 25, 42]; function condition(value, index, array) ( var result = false; if (value === 8) ( result = true; ) return result; ); var passed = numbers.some(condition); // true
filter()Метод filter() , як some() і every() приймає функцію умови. Але при цьому повертає масив тих елементів, які відповідають цій умові:
Var numbers = [1, -12, 8, -4, 25, 42]; function condition(value, index, array) ( var result = false; if (value > 0) ( result = true; ) return result; ); var filteredNumbers = numbers.filter(condition); for(var i=0; i< filteredNumbers.length; i++)
document.write(filteredNumbers[i] + "
");
Висновок у браузері:
1 8 25 42
forEach() і map()Методи forEach() і map() здійснюють перебір елементів і виконують з ними певні операції. Наприклад, для обчислення квадратів чисел у масиві можна використовувати наступний код:
Var numbers = [1, 2, 3, 4, 5, 6]; for(var i = 0; i
- HTML
- JavaScript
Розглянемо спосіб, за допомогою якого можна визначити останній індекс (елемент) методі jQuery each .
// Вибираємо елементи var myList = $ ("ul li"); // Визначаємо кількість елементом у вибірці var total = myList.length; // здійснюємо перебір обраних елементів myList.each(function(index) ( if (index === total - 1) ( // це останній елемент у вибірці )));
Визначення та застосуванняJavaScript метод forEach() дозволяє виконати передану функцію один раз для кожного елемента в масиві в порядку зростання індексу.
Звертаю Вашу увагу, що функція зворотного виклику, передана як параметр методу forEach() не буде викликана для видалених або пропущених елементів масиву.
Діапазон елементів, що обробляються за допомогою методу forEach(), встановлюється перед першимдзвінком функції зворотного дзвінка. Якщо елементи були додані до масиву після виклику, то на таких елементах функція викликана не буде.
Якщо значення існуючих елементів масиву змінюються в момент виконання, то як значення функції, що передається, буде значення в той момент часу, коли метод forEach() відвідує їх. Якщо елементи видаляються до відвідування, такі елементи відвідані не будуть. Якщо елементи, які вже відвідані, видаляються під час проходу масивом, то пізніші елементи будуть пропущені.
Підтримка браузерамиforEach() | Так | Так | Так | Так | 9.0 | Так |
function | Функція зворотного дзвінка, яка буде виконана одинразів для кожного елемента в масиві. Функція приймає такі параметри:
Якщо як параметр методу передається щось, що не є об'єктом функції, то буде викликано виняток TypeError. Обов'язковий параметр. |
thisValue | Об'єкт, на який може посилатися ключове слово цьоговсередині функції зворотного виклику. Якщо параметр thisValueне використовується, то як значення this буде використовуватися undefined (в кінцевому рахунку this буде залежати від звичайних правил контексту виконання функції). Необов'язковий параметр. |
У наступному прикладі ми розглянемо, як отримати суму всіх елементів масиву з використанням JavaScriptметоду forEach() :
var array =; array var sum = 0; // ініціалізуємо змінну, що містить числове значення currentValue) { .forEach(// перебираємо всі елементи масиву array function sumNumber( += currentValue sum .forEach(// перебираємо всі елементи масиву array function sumNumber(;))); console .log( ); // виводимо значення змінної sum рівне 50У наступному прикладі ми розглянемо використання другогоаргумент методу forEach() , який вказує на об'єкт, на який ми можемо посилатися з використанням
var numbers =; // ініціалізуємо змінну, що містить масив числових значень var squared =; // ініціалізуємо змінну, що містить порожній масив var myObject = ( // ініціалізуємо змінну, що містить об'єкт square: function ( currentValue) ( // метод об'єкта, який набуває значення return currentValue * currentValue; // і повертає його зведеним у квадрат)); numbers.forEach(// перебираємо всі елементи масиву numbers function ( currentValue) { squared.push(this .square( currentValue)); // додаємо в масив squared значення методу square об'єкта myObject , що повертається, myObject// об'єкт, який ми посилаємося з допомогою ключового слова this ); console .log( squared); // Виводимо значення змінної squared рівне;- I. Перебір реальних масивів
- Метод forEach і споріднені методи
- Цикл for
- Правильне використання циклу for...in
- Цикл for...of (неявне використання ітератора)
- Явне використання ітератора
- ІІ. Перебір масивоподібних об'єктів
- Використання способів перебору справжніх масивів
- Перетворення на справжній масив
- Зауваження щодо об'єктів середовища виконання
На даний момент є три способи перебору елементів цього масиву:
Крім того, незабаром, з появою нового стандарту ECMAScript 6 (ES 6), очікується ще два способи:
Якщо ваш проект розрахований на підтримку можливостей стандарту ECMAScript 5 (ES5), можна використовувати одне з його нововведень - метод forEach .
Приклад використання:
Var a = ["a", "b", "c"]; a.forEach(function(entry) ( console.log(entry); ));
У загальному випадку використання forEach вимагає підключення бібліотеки емуляції es5-shim для браузерів, які не мають нативної підтримки цього методу. До них відносяться IE 8 і раніше версії, які до цих пір де-не-де ще використовуються.
До переваг дляEach відноситься те, що тут не потрібно оголошувати локальні змінні для зберігання індексу та значення поточного елемента масиву, оскільки вони автоматично передаються у функцію зворотного виклику (колбек) як аргументи.
Якщо вас турбують можливі витрати на виклик колбека для кожного елемента, не хвилюйтеся та прочитайте це.
forEach призначений для перебору всіх елементів масиву, але крім нього ES5 пропонує ще кілька корисних методів для перебору всіх або деяких елементів плюс виконання при цьому будь-яких дій з ними:
- every - повертає true, якщо для кожного елемента масиву колбек повертає значення, що приводиться до true.
- some-повертає true, якщо хоча б для одного елемента масиву колбек повертає значення, що приводиться до true.
- filter - створює новий масив, що включає елементи вихідного масиву, для яких колбек повертає true .
- map - створює новий масив, що складається з значень колбеком, що обертаються.
- reduce - зводить масив до єдиного значення, застосовуючи колбек по черзі до кожного елемента масиву, починаючи з першого (може бути корисним для обчислення суми елементів масиву та інших підсумкових функцій).
- reduceRight – працює аналогічно reduce, але перебирає елементи у зворотному порядку.
Старий добрий for рулит:
Var a = ["a", "b", "c"]; var index; for (index = 0; index< a.length; ++index) { console.log(a); }
Якщо довжина масиву незмінна протягом усього циклу, а сам цикл належить критичній у плані продуктивності ділянці коду (що малоймовірно), то можна використовувати більш оптимальну версію for зі зберіганням довжини масиву:
Var a = ["a", "b", "c"]; var index, len; for (index = 0, len = a.length; index< len; ++index) { console.log(a); }
Теоретично цей код має виконуватися трохи швидше, ніж попередній.
Якщо порядок перебору елементів не важливий, то можна піти ще далі в плані оптимізації та позбутися змінної для зберігання довжини масиву, змінивши порядок перебору на зворотний:
Var a = ["a", "b", "c"]; var index; for (index = a.length - 1; index >= 0; --index) ( console.log(a); )
Тим не менш, у сучасних движках JavaScript подібні ігри з оптимізацією зазвичай нічого не означають.
3. Правильне використання циклу for...inЯкщо вам порадять використовувати цикл for ... in, пам'ятайте, що перебір масивів - не те, для чого він призначений. Попри поширену оману цикл for...in перебирає не індекси масиву, а перераховані властивості об'єкта.
Тим не менш, у деяких випадках, таких як перебір розріджених масивів , for ... in може виявитися корисним, якщо тільки дотримуватися при цьому запобіжних заходів, як показано в прикладі нижче:
// a - розріджений масив var a =; a = "a"; a = "b"; a = "c"; for (var key in a) ( if (a.hasOwnProperty(key) && /^0$|^d*$/.test(key) && key