Інтернет Windows Android

Foreach js для масивів і колекцій. Всі способи перебору масиву в JavaScript

  • I. Перебір справжніх масивів
    1. Метод forEach і родинні методи
    2. цикл for
    3. Правильне використання циклу for ... in
    4. Цикл for ... of (неявне використання ітератора)
    5. Явне використання ітератора
    1. Використання способів перебору справжніх масивів
    2. Перетворення в справжній масив
    3. Зауваження по об'єктах середовища виконання

I. Перебір справжніх масивів

На даний момент є три способи перебору елементів справжнього масиву:
  1. метод Array.prototype.forEach;
  2. класичний цикл for;
  3. «Правильно» побудований цикл for ... in.
Крім того, незабаром, з появою нового стандарту ECMAScript 6 (ES 6), очікується ще два способи:
  1. цикл for ... of (неявне використання ітератора);
  2. явне використання ітератора.

1. Метод forEach і родинні методи

Якщо ваш проект розрахований на підтримку можливостей стандарту ECMAScript 5 (ES5), ви можете використовувати одне з його нововведень - метод forEach.

Приклад використання:
var a \u003d [ "a", "b", "c"]; a.forEach (function (entry) (console.log (entry);));
У загальному випадку використання forEach вимагає підключення бібліотеки емуляції es5-shim для браузерів, які не мають нативної підтримки цього методу. До них відносяться IE 8 і більш ранні версії, які до сих пір подекуди ще використовуються.

До переваг forEach відноситься те, що тут не потрібно оголошувати локальні змінні для зберігання індексу і значення поточного елемента масиву, оскільки вони автоматично передаються в функцію зворотного виклику (колбек) в якості аргументів.

Якщо вас турбують можливі витрати на виклик колбек для кожного елемента, не хвилюйтеся і прочитайте це.

ForEach призначений для перебору всіх елементів масиву, але крім нього ES5 пропонує ще кілька корисних методів для перебору всіх або деяких елементів плюс виконання при цьому будь-яких дій з ними:

  • every - повертає true, якщо для кожного елемента масиву колбек повертає значення приводиться до true.
  • some - повертає true, якщо хоча б для одного елемента масиву колбек повертає значення приводиться до true.
  • filter - створює новий масив, що включає ті елементи вихідного масиву, для яких колбек повертає true.
  • map - створює новий масив, що складається з значень, що родить! колбек.
  • reduce - зводить масив до єдиного значенням, застосовуючи колбек по черзі до кожного елементу масиву, починаючи з першого (може бути корисний для обчислення суми елементів масиву та інших підсумкових функцій).
  • reduceRight - працює аналогічно reduce, але перебирає елементи в зворотному порядку.

2. Цикл for

Старий добрий for рулить:

Var a \u003d [ "a", "b", "c"]; var index; for (index \u003d 0; index< a.length; ++index) { console.log(a); }
Якщо довжина масиву незмінна протягом всього циклу, а сам цикл належить критичного в плані продуктивності ділянці коду (що малоймовірно), то можна використовувати «більш оптимальну» версію for зі зберіганням довжини масиву:

Var a \u003d [ "a", "b", "c"]; var index, len; for (index \u003d 0, len \u003d a.length; index< len; ++index) { console.log(a); }
Теоретично цей код повинен виконуватися трохи швидше, ніж попередній.

Якщо порядок перебору елементів не важливий, то можна піти ще далі в плані оптимізації і позбутися від змінної для зберігання довжини масиву, змінивши порядок перебору на зворотний:

Var a \u003d [ "a", "b", "c"]; var index; for (index \u003d a.length - 1; index\u003e \u003d 0; --index) (console.log (a);)
Проте, в сучасних двигунах JavaScript подібні ігри з оптимізацією зазвичай нічого не значать.

3. Правильне використання циклу for ... in

Якщо вам порадять використовувати цикл for ... in, пам'ятайте, що перебір масивів - не те, для чого він призначений. Всупереч поширеній помилці цикл for ... in перебирає НЕ індекси масиву, а перелічуваних властивості об'єкта.

Проте, в деяких випадках, таких як перебір розріджених масивів, for ... in може виявитися корисним, якщо тільки дотримуватися при цьому запобіжні заходи, як показано в прикладі нижче:

// a - розріджений масив var a \u003d; a \u003d "a"; a \u003d "b"; a \u003d "c"; for (var key in a) (if (a.hasOwnProperty (key) && /^0$|^\\d*$/.test(key) && key<= 4294967294) { console.log(a); } }
В даному прикладі на кожній ітерації циклу виконується дві перевірки:

  1. то, що масив має власне властивість з ім'ям key (не успадкованих з його прототипу).
  2. то, що key - рядок, що містить десяткову запис цілого числа, значення якого менше 4294967294. Звідки береться останнє число? З визначення індексу масиву в ES5, з якого випливає, що найбільший індекс, який може мати елемент в масиві: (2 ^ 32 - 2) \u003d 4294967294.
Звичайно, такі перевірки віднімуть зайвий час при виконанні циклу. Але в разі розрідженого масиву цей спосіб більш ефективний, ніж цикл for, оскільки в цьому випадку перебираються тільки ті елементи, які явно визначені в масиві. Так, в прикладі вище буде виконано всього 3 ітерації (для індексів 0, 10 і 10000) - проти 10001 в циклі for.

Щоб не писати такий громіздкий код перевірок кожного разу, коли потрібно перебір масиву, можна оформити його у вигляді окремої функції:

Function arrayHasOwnIndex (array, key) (return array.hasOwnProperty (key) && /^0$|^\\d*$/.test(key) && key<= 4294967294; }
Тоді тіло циклу з прикладу значно скоротиться:

For (key in a) (if (arrayHasOwnIndex (a, key)) (console.log (a);))
Розглянутий вище код перевірок є універсальним, відповідним для всіх випадків. Але замість нього можна використовувати більш коротку версію, хоча формально і не зовсім правильну, але, тим не менш, яка підходить для більшості випадків:

For (key in a) (if (a.hasOwnProperty (key) && String (parseInt (key, 10)) \u003d\u003d\u003d key) (console.log (a);))

4. Цикл for ... of (неявне використання ітератора)

ES6, поки все ще перебуває в статусі чернетки, повинен ввести в JavaScript ітератори.

итератор - це реалізований об'єктом протокол, який визначає стандартний спосіб отримання послідовності значень (кінцевої або нескінченної).
Итератор - це об'єкт, в якому визначено метод next () - функція без аргументів, що повертає об'єкт з двома властивостями:

  1. done (boolean) - приймає значення true, якщо итератор досяг кінця ітеріруемой послідовності. В іншому випадку має значення false.
  2. value - визначає значення, що повертається ітератором. Може бути не визначено (відсутні), якщо властивість done має значення true.
Багато вбудовані об'єкти, в т.ч. справжні масиви, мають ітератори за замовчуванням. Найпростіший спосіб застосування ітератора в справжніх масивах - використовувати нову конструкцію for ... of.

Приклад використання for ... of:

Var val; var a \u003d [ "a", "b", "c"]; for (val of a) (console.log (val);)
У наведеному прикладі цикл for ... of неявно викликає итератор об'єкта Array для отримання кожного значення масиву.

5. Явний використання ітератора

Ітератори можна також використовувати і явно, правда, в цьому випадку код стає значно складніше, в порівнянні з циклом for ... of. Виглядає це приблизно так:

Var a \u003d [ "a", "b", "c"]; var it \u003d a.entries (); var entry; while (! (entry \u003d it.next ()). done) (console.log (entry.value);)
В даному прикладі метод Array.prototype.entries повертає ітератор, який використовується для виведення значень масиву. На кожній ітерації entry.value містить масив виду [ключ, значення].

II. Перебір массівоподобних об'єктів

Крім справжніх масивів, в JavaScript зустрічаються також массівоподобние об'єкти . Зі справжніми масивами їх ріднить те, що вони мають властивість length і властивості з іменами у вигляді чисел, відповідні елементам масиву. Як приклади можна назвати DOM колекції NodeList і псевдомассів arguments, доступний всередині будь-якої функції / методу.

1. Використання способів перебору справжніх масивів

Як мінімум більшість, якщо не всі, способи перебору справжніх масивів можуть бути застосовані для перебору массівоподобних об'єктів.

Конструкції for і for ... in можуть бути застосовані до массівоподобним об'єктів точно тим же шляхом, що й до справжніх масивів.

ForEach і інші методи Array.prototype також застосовні до массівоподобним об'єктів. Для цього потрібно використовувати виклик Function.call або Function.apply.

Наприклад, якщо ви хочете застосувати forEach до властивості childNodes об'єкта Node, то це робиться так:

Array.prototype.forEach.call (node.childNodes, function (child) (// робимо що-небудь з об'єктом child));
Для зручності повторного використання цього прийому, можна оголосити посилання на метод Array.prototype.forEach в окремій змінної і використовувати її як скорочення:

// (Передбачається, що весь код нижче знаходиться в одній області видимості) var forEach \u003d Array.prototype.forEach; // ... forEach.call (node.childNodes, function (child) (// робимо що-небудь з об'єктом child));
Якщо в массівоподобном об'єкті є итератор, то його можна використовувати явно або неявно для перебору об'єкта таким же способом, як і для справжніх масивів.

2. Перетворення в справжній масив

Є також ще один, дуже простий, спосіб перебору массівоподобного об'єкта: перетворити його в справжній масив і використовувати будь-який з розглянутих вище способів перебору справжніх масивів. Для перетворення можна використовувати універсальний метод Array.prototype.slice, який може бути застосований до будь-якого массівоподобному об'єкту. Робиться це дуже просто, як показано в прикладі нижче:

Var trueArray \u003d Array.prototype.slice.call (arrayLikeObject, 0);
Наприклад, якщо ви хочете перетворити колекцію NodeList в справжній масив, вам потрібен приблизно такий код:

Var divs \u003d Array.prototype.slice.call (document.querySelectorAll ( "div"), 0);
Update: Як було зазначено в коментарях rock і torbasow, в ES6 замість Array.prototype.slice можна використовувати більш наочний метод Array.from.

3. Зауваження по об'єктах середовища виконання

Якщо ви застосовуєте методи Array.prototype до об'єктів середовища виконання (таких як DOM колекції), то ви повинні мати на увазі, що правильна робота цих методів не гарантована у всіх середовищах виконання (в т.ч. в браузерах). Це залежить від поведінки конкретного об'єкта в конкретному середовищі виконання, якщо точніше, від того, як в цьому об'єкті реалізована абстрактна операція HasProperty. Проблема в тому, що сам стандарт ES5 допускає можливість неправильної поведінки об'єкта по відношенню до цієї операції (див. §8.6.2).

Тому важливо тестувати роботу методів Array.prototype в кожному середовищі виконання (браузері), в якій планується використання вашого застосування.

  • I. Перебір справжніх масивів
    1. Метод forEach і родинні методи
    2. цикл for
    3. Правильне використання циклу for ... in
    4. Цикл for ... of (неявне використання ітератора)
    5. Явне використання ітератора
  • II. Перебір массівоподобних об'єктів
    1. Використання способів перебору справжніх масивів
    2. Перетворення в справжній масив
    3. Зауваження по об'єктах середовища виконання

I. Перебір справжніх масивів

На даний момент є три способи перебору елементів справжнього масиву:

  1. метод Array.prototype.forEach;
  2. класичний цикл for;
  3. «Правильно» побудований цикл for ... in.

Крім того, незабаром, з появою нового стандарту ECMAScript 6 (ES 6), очікується ще два способи:

  1. цикл for ... of (неявне використання ітератора);
  2. явне використання ітератора.

1. Метод forEach і родинні методи

Якщо ваш проект розрахований на підтримку можливостей стандарту ECMAScript 5 (ES5), ви можете використовувати одне з його нововведень - метод forEach.

Приклад використання:

Var a \u003d [ "a", "b", "c"]; a.forEach (function (entry) (console.log (entry);));

У загальному випадку використання forEach вимагає підключення бібліотеки емуляції es5-shim для браузерів, які не мають нативної підтримки цього методу. До них відносяться IE 8 і більш ранні версії, які до сих пір подекуди ще використовуються.

До переваг forEach відноситься те, що тут не потрібно оголошувати локальні змінні для зберігання індексу і значення поточного елемента масиву, оскільки вони автоматично передаються в функцію зворотного виклику (колбек) в якості аргументів.

Якщо вас турбують можливі витрати на виклик колбек для кожного елемента, не хвилюйтеся і прочитайте це.

forEach призначений для перебору всіх елементів масиву, але крім нього ES5 пропонує ще кілька корисних методів для перебору всіх або деяких елементів плюс виконання при цьому будь-яких дій з ними:

  • every - повертає true, якщо для кожного елемента масиву колбек повертає значення приводиться до true.
  • some - повертає true, якщо хоча б для одного елемента масиву колбек повертає значення приводиться до true.
  • filter - створює новий масив, що включає ті елементи вихідного масиву, для яких колбек повертає true.
  • map - створює новий масив, що складається з значень, що родить! колбек.
  • reduce - зводить масив до єдиного значенням, застосовуючи колбек по черзі до кожного елементу масиву, починаючи з першого (може бути корисний для обчислення суми елементів масиву та інших підсумкових функцій).
  • reduceRight - працює аналогічно reduce, але перебирає елементи в зворотному порядку.

2. Цикл for

Старий добрий for рулить:

Var a \u003d [ "a", "b", "c"]; var index; for (index \u003d 0; index< a.length; ++index) { console.log(a); }

Якщо довжина масиву незмінна протягом всього циклу, а сам цикл належить критичного в плані продуктивності ділянці коду (що малоймовірно), то можна використовувати «більш оптимальну» версію for зі зберіганням довжини масиву:

Var a \u003d [ "a", "b", "c"]; var index, len; for (index \u003d 0, len \u003d a.length; index< len; ++index) { console.log(a); }

Теоретично цей код повинен виконуватися трохи швидше, ніж попередній.

Якщо порядок перебору елементів не важливий, то можна піти ще далі в плані оптимізації і позбутися від змінної для зберігання довжини масиву, змінивши порядок перебору на зворотний:

Var a \u003d [ "a", "b", "c"]; var index; for (index \u003d a.length - 1; index\u003e \u003d 0; --index) (console.log (a);)

Проте, в сучасних двигунах JavaScript подібні ігри з оптимізацією зазвичай нічого не значать.

3. Правильне використання циклу for ... in

Якщо вам порадять використовувати цикл for ... in, пам'ятайте, що перебір масивів - не те, для чого він призначений. Всупереч поширеній помилці цикл for ... in перебирає НЕ індекси масиву, а перелічуваних властивості об'єкта.

Проте, в деяких випадках, таких як перебір розріджених масивів, for ... in може виявитися корисним, якщо тільки дотримуватися при цьому запобіжні заходи, як показано в прикладі нижче:

// a - розріджений масив var a \u003d; a \u003d "a"; a \u003d "b"; a \u003d "c"; for (var key in a) (if (a.hasOwnProperty (key) && /^0$|^d*$/.test(key) && key<= 4294967294) { console.log(a); } }

В даному прикладі на кожній ітерації циклу виконується дві перевірки:

  1. то, що масив має власне властивість з ім'ям key (не успадкованих з його прототипу).
  2. то, що key - рядок, що містить десяткову запис цілого числа, значення якого менше 4294967294. Звідки береться останнє число? З визначення індексу масиву в ES5, з якого випливає, що найбільший індекс, який може мати елемент в масиві: (2 ^ 32 - 2) \u003d 4294967294.

Звичайно, такі перевірки віднімуть зайвий час при виконанні циклу. Але в разі розрідженого масиву цей спосіб більш ефективний, ніж цикл for, оскільки в цьому випадку перебираються тільки ті елементи, які явно визначені в масиві. Так, в прикладі вище буде виконано всього 3 ітерації (для індексів 0, 10 і 10000) - проти 10001 в циклі for.

Щоб не писати такий громіздкий код перевірок кожного разу, коли потрібно перебір масиву, можна оформити його у вигляді окремої функції:

Function arrayHasOwnIndex (array, key) (return array.hasOwnProperty (key) && /^0$|^d*$/.test(key) && key<= 4294967294; }

Тоді тіло циклу з прикладу значно скоротиться:

For (key in a) (if (arrayHasOwnIndex (a, key)) (console.log (a);))

Розглянутий вище код перевірок є універсальним, відповідним для всіх випадків. Але замість нього можна використовувати більш коротку версію, хоча формально і не зовсім правильну, але, тим не менш, яка підходить для більшості випадків:

For (key in a) (if (a.hasOwnProperty (key) && String (parseInt (key, 10)) \u003d\u003d\u003d key) (console.log (a);))

4. Цикл for ... of (неявне використання ітератора)

ES6, поки все ще перебуває в статусі чернетки, повинен ввести в JavaScript ітератори.

итератор - це реалізований об'єктом протокол, який визначає стандартний спосіб отримання послідовності значень (кінцевої або нескінченної).
Об'єкт має итератор, якщо в ньому визначено метод next () - функція без аргументів, що повертає об'єкт з двома властивостями:

  1. done (boolean) - приймає значення true, якщо итератор досяг кінця ітеріруемой послідовності. В іншому випадку має значення false.
  2. value - визначає значення, що повертається ітератором. Може бути не визначено (відсутні), якщо властивість done має значення true.

Багато вбудовані об'єкти, в т.ч. справжні масиви, мають ітератори за замовчуванням. Найпростіший спосіб застосування ітератора в справжніх масивах - використовувати нову конструкцію for ... of.

Приклад використання for ... of:

Var val; var a \u003d [ "a", "b", "c"]; for (val of a) (console.log (val);)

У наведеному прикладі цикл for ... of неявно викликає итератор об'єкта Array для отримання кожного значення масиву.

5. Явний використання ітератора

Ітератори можна також використовувати і явно, правда, в цьому випадку код стає значно складніше, в порівнянні з циклом for ... of. Виглядає це приблизно так:

Var a \u003d [ "a", "b", "c"]; var entry; while (! (entry \u003d a.next ()). done) (console.log (entry.value);)

II. Перебір массівоподобних об'єктів

Крім справжніх масивів, в JavaScript зустрічаються також массівоподобние об'єкти . Зі справжніми масивами їх ріднить те, що вони мають властивість length і властивості з іменами у вигляді чисел, відповідні елементам масиву. Як приклади можна назвати DOM колекції NodeList і псевдомассів arguments, доступний всередині будь-якої функції / методу.

1. Використання способів перебору справжніх масивів

Як мінімум більшість, якщо не всі, способи перебору справжніх масивів можуть бути застосовані для перебору массівоподобних об'єктів.

Конструкції for і for ... in можуть бути застосовані до массівоподобним об'єктів точно тим же шляхом, що й до справжніх масивів.

forEach і інші методи Array.prototype також застосовні до массівоподобним об'єктів. Для цього потрібно використовувати виклик Function.call або Function.apply.

Наприклад, якщо ви хочете застосувати forEach до властивості childNodes об'єкта Node, то це робиться так:

Array.prototype.forEach.call (node.childNodes, function (child) (// робимо що-небудь з об'єктом child));

Для зручності повторного використання цього прийому, можна оголосити посилання на метод Array.prototype.forEach в окремій змінної і використовувати її як скорочення:

// (Передбачається, що весь код нижче знаходиться в одній області видимості) var forEach \u003d Array.prototype.forEach; // ... forEach.call (node.childNodes, function (child) (// робимо що-небудь з об'єктом child));

Якщо в массівоподобном об'єкті є итератор, то його можна використовувати явно або неявно для перебору об'єкта таким же способом, як і для справжніх масивів.

2. Перетворення в справжній масив

Є також ще один, дуже простий, спосіб перебору массівоподобного об'єкта: перетворити його в справжній масив і використовувати будь-який з розглянутих вище способів перебору справжніх масивів. Для перетворення можна використовувати універсальний метод Array.prototype.slice, який може бути застосований до будь-якого массівоподобному об'єкту. Робиться це дуже просто, як показано в прикладі нижче:

Var trueArray \u003d Array.prototype.slice.call (arrayLikeObject, 0);

Наприклад, якщо ви хочете перетворити колекцію NodeList в справжній масив, вам потрібен приблизно такий код:

Var divs \u003d Array.prototype.slice.call (document.querySelectorAll ( "div"), 0);

3. Зауваження по об'єктах середовища виконання

Якщо ви застосовуєте методи Array.prototype до об'єктів середовища виконання (таких як DOM колекції), то ви повинні мати на увазі, що правильна робота цих методів не гарантована у всіх середовищах виконання (в т.ч. в браузерах). Це залежить від поведінки конкретного об'єкта в конкретному середовищі виконання, якщо точніше, від того, як в цьому об'єкті реалізована абстрактна операція HasProperty. Проблема в тому, що сам стандарт ES5 допускає можливість неправильної поведінки об'єкта по відношенню до цієї операції (див. §8.6.2).

Тому важливо тестувати роботу методів Array.prototype в кожному середовищі виконання (браузері), в якій планується використання вашого застосування.

Визначення та застосування

JavaScript метод forEach () дозволяє виконати передану функцію один раз для кожного елемента в масиві в порядку зростання індексу.

Звертаю Вашу увагу, що функція зворотного виклику, передана в якості параметра методу forEach () НЕ буде викликана для віддалених, або пропущених елементів масиву.

Діапазон елементів, оброблюваних за допомогою методу forEach () встановлюється перед першим викликом функції зворотного виклику. Якщо елементи були додані до масиву після її виклику, то на таких елементах функція викликана не буде.

Якщо значення існуючих елементів масиву змінюються в момент виконання, то в якості переданого значення функції буде значення в той момент часу, коли метод forEach () відвідує їх. Якщо елементи видаляються до їх відвідування, то такі елементи відвідані не будуть. Якщо елементи, які вже відвідані, видаляються під час проходу по масиву, то більш пізні елементи будуть пропущені.

підтримка браузерами

метод
Opera

IExplorer

Edge
forEach () ТакТакТакТак9.0 Так

JavaScript синтаксис:

// тільки з callback функцією array.forEach (function ( currentValue, index, arr)); // з використанням об'єкта, на який може посилатися ключове слово this array.forEach (function ( currentValue, index, arr), thisValue);

версія JavaScript

ECMAScript 5.1 (Реалізовано в JavaScript 1.6)

значення параметрів

параметропис
function Функція зворотного виклику, яка буде виконана один раз для кожного елемента в масиві. Функція приймає такі параметри:
  • currentValue - значення поточного елемента
  • index - індекс масиву поточного елемента.
  • arr - масив, до якого належить поточний елемент (за яким відбувається прохід).

Якщо в якості параметра методу передається щось, що не є об'єктом функції, то буде викликано виключення TypeError. Обов'язковий параметр.

thisValue Об'єкт, на який може посилатися ключове слово this всередині функції зворотного виклику. якщо параметр thisValue не використовується, то в якості значення this буде використовуватися undefined (в кінцевому рахунку this буде залежати від звичайних правил контексту виконання функції). Необов'язковий параметр.

приклад використання

У наступному прикладі ми розглянемо як отримати суму всіх елементів масиву з використанням JavaScript методу forEach ():

var array \u003d; var sum \u003d 0; // инициализируем змінну, що містить числове значення array.forEach ( // перебираємо всі елементи масиву array function sumNumber ( currentValue) { sum += currentValue; )); console .log ( sum); // виводимо значення змінної sum рівне 50

У наступному прикладі ми розглянемо використання другого аргументу методу forEach (), Який вказує на об'єкт, на який ми можемо посилатися з використанням ключового слова this всередині функції зворотного виклику:

var numbers \u003d; // инициализируем змінну, що містить масив числових значень var squared \u003d; // инициализируем змінну, що містить порожній масив var myObject \u003d ( // инициализируем змінну, що містить об'єкт 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 рівне;

Не так давно мені треба було на JavaScript створити асоціативний масив. Дивним чином, він мені раніше ніколи не був потрібен в JavaScript. Я поліз шукати в Інтернет, як його зробити. І був дуже здивований, що величезна кількість людей пишуть, що це неможливо, в JavaScript його нема. Благо мій багаторічний досвід підказував мені, що вони несуть марення. Тому, врешті-решт, я дізнався, як створити асоціативний масив в JavaScript, Про що і розповім в даній статті.

Нижче написаний код, в якому створюється асоціативний масив, Додається потім ще один елемент і, нарешті, масив перебирається через цикл:

У цій статті ми розглянули створення асоціативних масивів, Їх зміна, а також повний перебір через цикл for. Особисто я використовував асоціативні масиви в JavaScript лише одного разу, але знати про таку можливість потрібно обов'язково.

Стаття, в якій розглянемо на прикладах використання функції і методу бібліотеки jQuery each.

У бібліотеці jQuery є 2 різні сутності з назвою each.

Перша (jQuery.each) - це універсальна функція jQuery за допомогою якої можна здійснити перебір елементів масиву або об'єкта.

Друга (each) - це метод, який застосовується до набору елементів для організації циклу по ним.

Цикл each (jQuery.each). приклади використання

Синтаксис функції each:

// array або object - масив або об'єкт, елементи або властивості якого необхідно перебрати // callback - функція, яка буде виконана для кожного елемента масиву або властивості об'єкта $ .each (array або object, callback);

Роботу з функцією each розберемо на прикладах.

Приклад №1. У ньому виконаємо переберор всіх елементів масиву (array).

// масив, що складається з 3 рядків var arr \u003d [ "Автомобіль", "Вантажівка", "Автобус"]; // переберемо масив arr $ .each (arr, function (index, value) (// дії, які будуть виконуватися для кожного елемента масиву // index - це поточний індекс елемента масиву (число) // value - це значення поточного елемента масиву // виведемо індекс і значення масиву в консоль console.log ( "індекс:" + index + "; значення:" + value);)); / * Результат (в консолі): Індекс: 0; Значення: Автомобіль Індекс: 1; Значення: Вантажівка Індекс: 2; Значення: Автобус * /

У вищенаведеному коді функція each використовується для перебору масиву. функція має 2 обов'язкових параметра. Перший параметр - це сутність (масив або об'єкт), елементи (властивості) якої необхідно перебрати. В даному випадку - це масив arr. Другий параметр - це функція зворотного виклику, яка буде виконана для кожного елемента (в даному випадку) масиву. Вона має 2 параметри, які доступні всередині неї за допомогою відповідних змінних. Перший параметр - це порядковий номер елемента (відлік виконується з 0). Другий параметр - це значення поточного елемента масиву.

Приклад №2. У цьому прикладі можна здійснити перебір всіх властивостей об'єкта.


// об'єкт smartphone, що має 5 властивостей var smartphone \u003d ( "name": "LG G5 se", "year": "2016", "screen-size": "5.3", "screen-resolution": "2560 x 1440 "," os ":" Android 6.0 (Marshmallow) "); // переберемо об'єкт smartphone $ .each (smartphone, function (key, value) (// дії, які будуть виконуватися для кожного властивості об'єкта // key - поточне ім'я властивості масиву // value - значення поточного властивості об'єкта // виведемо ім'я властивості і його значення в консоль console.log ( "Властивість:" + key + "; значення:" + value);)); / * Результат (в консолі): Властивість: name; Значення: LG G5 se Властивість: year; Значення діє до: 2016 Властивість: screen-size; Значення: 5.3 Властивість: screen-resolution; Значення: 2560 x 1440 Властивість: os; Значення: Android 6.0 (Marshmallow) * /

Функція each може використовуватися для перебору JavaScript об'єктів. Відмінність її використання полягає тільки в тому, що параметри функції зворотного виклику мають інші значення. Перший параметр зберігає назву властивості об'єкта, а другий - значення цієї властивості.

Приклад №3. У ньому можна здійснити перебір складнішої структури (розглянемо, як використовувати вкладені each).

// об'єкт, що складається з 2 властивостей. Кожна властивість цього об'єкт має в якості значення масив, елементами якого є теж об'єкти var articles \u003d ( "Bootstrap": [( "id": "1", "title": "Введення"), ( "id": "2" , "title": "Як встановити"), ( "id": "3", "title": "Сітка")], "JavaScript": [( "id": "4", "title": "Основи "), (" id ":" 5 "," title ":" Вибірка елементів ")]); $ .Each (articles, function (key, data) (console.log ( "Розділ:" + key); $ .each (data, function (index, value) (console.log ( "Стаття: id \u003d" + value [ "id"] + "; Назва \u003d" + value [ "title"]);));)); / * Результат: Розділ: Bootstrap Стаття: id \u003d 1; Назва \u003d Введення Стаття: id \u003d 2; Назва \u003d Як встановити Стаття: id \u003d 3; Назва \u003d Сітка Розділ: JavaScript Стаття: id \u003d 4; Назва \u003d Основи Стаття: id \u003d 5; Назва \u003d Вибірка елементів * /

Як перервати each (вийти з циклу)?

Переривання (break) циклу each здійснюється за допомогою оператора return, який повинен повертати значення false.

Наприклад, перервемо виконання циклу each після того як знайдемо в масиві arr число 7:

// масив, що складається з 5 чисел var arr \u003d; // число, яке необхідно знайти var find \u003d 7; // переберемо масив arr $ .each (arr, function (index, value) (// якщо необхідне число знайдено, то .. if (value \u003d\u003d\u003d find) (// вивести його в консоль console.log ( "Ура! число "+ find +" знайдено! Дане число має індекс: "+ index); // перервати виконання циклу return false;) else (// інакше вивести в консоль поточне число console.log (" поточне число: "+ value); ))); / * Результат (в консолі): Поточне число: 5 Поточне число: 4 Ура! Число 7 знайдено! Дане число має індекс: 2 * /

Як перейти до наступної ітерації (each continue)?

У each переривання виконання поточної ітерації і перехід до наступної здійснюється за допомогою оператора return, який повинен мати значення відмінне від false.

// масив, що складається з чисел var arr \u003d; // масив, який повинен містити всі елементи масиву arr, крім парних чисел var newarr \u003d; // переберемо масив arr $ .each (arr, function (index, value) (// якщо елемент парний, то пропустимо його if (value% 2 \u003d\u003d\u003d 0) (// перервемо виконання поточної ітерації і перейдемо до наступної return; ) // додати в масив newarr значення value newarr.push (value);)); console.log ( "Вихідний масив (arr):" + arr.join ()); console.log ( "результуючий масив (newarr):" + newarr.join ()); / * Результат (в консолі): Вихідний масив (arr): 3,5,4,9,17,19,30,35,40 Результуючий масив (newarr): 3,5,9,17,19,35 * /

Перебір поточних елементів (.each)

Синтаксис методу each (пременяется тільки до обраних елементів):


.each (function); // function - функція, яка буде виконана для кожного елемента поточного об'єкта

Розберемо, як працює метод.each на наступному прикладі (переберемо елементи div):


У вищенаведеному прикладі метод each використовує поточний набір (елементи, вибрані за допомогою селектора $ ( "div")). В якості обробника методу each завжди виступає функція, яка буде виконана для кожного елемента поточного набору (в даному випадку для кожного елемента div). Ця функція має 2 необов'язкові параметри. Один з них (index) являє собою порядковий номер поточної ітерації, а другий (element) - DOM посилання на поточний елемент. Крім цього всередині функції є ключове слово this, яке також як і другий параметр, містить DOM-посилання на поточний елемент.

Наприклад, виведемо в консоль значення атрибута href для всіх елементів а на сторінці:

$ ( "A"). Each (function () (console.log ($ (this) .attr ( "href"));));

$ ( "A"). Each (function () (var link \u003d $ (this) .attr ( "href"); if ((link.indexOf ( "http: //") \u003d\u003d 0) || (link .indexOf ( "https: //") \u003d\u003d 0)) (console.log ( "href посилання \u003d" + link);))); // Якщо на сторінці розташовані такі посилання: // Яндекс // Як працює JavaScript? // Bootstrap // То в консолі побачимо наступний результат: // https://www.yandex.ru/ // http://getbootstrap.com/

Наприклад, розглянемо, як організувати цикл each за елементами DOM, що мають клас name (переберемо всі елементи одного класу).

Raspberry pi
single-board compute
Intel Galileo Gen2
19$
Pine A64 Plus

Наприклад, розберемо, як перебрати всі елементи на сторінці.

Наприклад, виведемо значення всіх елементів input на сторінці.

$ ( "Input"). Each (function () (console.log ($ (this) .val ());));

Наприклад, переберемо всі дочірні елементи, розташовані в ul з id \u003d "myList" (each children).

  • HTML
  • JavaScript

Розглянемо спосіб, за допомогою якого можна визначити останній індекс (елемент) в методі jQuery each.

// вибираємо елементи var myList \u003d $ ( "ul li"); // визначаємо кількість елементом у вибірці var total \u003d myList.length; // здійснюємо перебір обраних елементів myList.each (function (index) (if (index \u003d\u003d\u003d total - 1) (// це останній елемент у вибірці)));