Статья, в которой рассмотрим на примерах использование функции и метода библиотеки 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 = ["Автомобиль","Грузовик","Автобус"]; // переберём массив arr $.each(arr,function(index,value){ // действия, которые будут выполняться для каждого элемента массива // index - это текущий индекс элемента массива (число) // value - это значение текущего элемента массива //выведем индекс и значение массива в консоль console.log("Индекс: " + index + "; Значение: " + value); }); /* Результат (в консоли): Индекс: 0; Значение: Автомобиль Индекс: 1; Значение: Грузовик Индекс: 2; Значение: Автобус */
В вышеприведённом коде функция each используется для перебора массива. Функция имеет 2 обязательных параметра . Первый параметр - это сущность (массив или объект), элементы (свойства) которой необходимо перебрать. В данном случае - это массив arr . Второй параметр - это функция обратного вызова, которая будет выполнена для каждого элемента (в данном случае) массива. Она имеет 2 параметра , которые доступны внутри неё посредством соответствующих переменных. Первый параметр - это порядковый номер элемента (отсчёт выполняется с 0). Второй параметр - это значение текущего элемента массива.
Пример №2. В этом примере осуществим перебор всех свойств объекта.
Функция each может использоваться для перебора JavaScript объектов. Отличие её использования заключается только в том, что параметры функции обратного вызова имеют другие значения. Первый параметр хранит название свойства объекта, а второй - значение этого свойства.
Пример №3. В нём осуществим перебор более сложной структуры (рассмотрим, как использовать вложенные each ).
// объект, состоящий из 2 свойств. Каждое свойство этого объект имеет в качестве значения массив, элементами которого являются тоже объекты var articles = { "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 = " + value["id"] + "; Название = "+ value["title"]); }); }); /* Результат: Раздел: Bootstrap Статья: id = 1; Название = Введение Статья: id = 2; Название = Как установить Статья: id = 3; Название = Сетка Раздел: JavaScript Статья: id = 4; Название = Основы Статья: id = 5; Название = Выборка элементов */
Как прервать each (выйти из цикла)?Прерывание (break) цикла each осуществляется с помощью оператора return , который должен возвращать значение false .
Например, прервём выполнение цикла each после того как найдём в массиве arr число 7:
// массив, состоящий из 5 чисел var arr = ; // число, которое необходимо найти var find = 7; // переберём массив arr $.each(arr, function (index, value) { // если необходимое число найдено, то.. if (value === find) { // вывести его в консоль console.log("Ура! Число " + find + " найдено! Данное число имеет индекс: " + index); // прервать выполнение цикла return false; } else { // иначе вывести в консоль текущее число console.log("Текущее число: " + value); } }); /* Результат (в консоли): Текущее число: 5 Текущее число: 4 Ура! Число 7 найдено! Данное число имеет индекс: 2 */
Как перейти к следующей итерации (each continue)?В each прерывание выполнения текущей итерации и переход к следующей осуществляется с помощью оператора return , который должен иметь значение отличное от false .
// массив, состоящий из чисел var arr = ; // массив, который должен содержать все элементы массива arr, кроме чётных чисел var newarr = ; // переберём массив arr $.each(arr, function (index, value) { // если элемент чётный, то пропустим его if (value % 2 === 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 на следующем примере (переберём элементы div):
// после загрузки DOM страницы выполнить $(function(){ // перебрать элементы div на странице $("div").each(function (index, element) { // index (число) - текущий индекс итерации (цикла) // данное значение является числом // начинается отсчёт с 0 и заканчивается количеству элементов в текущем наборе минус 1 // element - содержит DOM-ссылку на текущий элемент console.log("Индекс элемента div: " + index + "; id элемента = " + $(element).attr("id")); }); }); // Результат: // Индекс элемента div: 0; id элемента = id1 // Индекс элемента div: 1; id элемента = id2 // Индекс элемента div: 2; id элемента = id3
В вышеприведённом примере метод each использует текущий набор (элементы, выбранные посредством селектора $("div")). В качестве обработчика метода each всегда выступает функция, которая будет выполнена для каждого элемента текущего набора (в данном случае для каждого элемента div). Данная функция имеет 2 необязательных параметра. Один из них (index) представляет собой порядковый номер текущей итерации, а второй (element) - DOM ссылку на текущий элемент. Кроме этого внутри функции доступно ключевое слово this , которое также как и второй параметр, содержит DOM-ссылку на текущий элемент.
Например, выведем в консоль значение атрибута href для всех элементов а на странице:
$("a").each(function() { console.log($(this).attr("href")); });
$("a").each(function() { var link = $(this).attr("href"); if ((link.indexOf("http://") == 0) || (link.indexOf("https://") == 0)) { console.log("href ссылки = " + 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 // с помощью функции jQuery.each ($.each) $.each($(".name"),function(index,data) { console.log("Порядковый номер: " + index + " ; Содержимое: " +$(data).text()); }); // с помощью метода jQuery .each $(".name").each(function(index,data) { console.log("Порядковый номер: " + index + " ; Содержимое: " +$(data).text()); }); // Получим следующий ответ: // Порядковый номер: 0 ; Содержимое: Raspberry pi // Порядковый номер: 1 ; Содержимое: Intel Galileo Gen2 // Порядковый номер: 2 ; Содержимое: Pine A64 Plus
Например, разберём, как перебрать все элементы на странице.
$("*").each(function() { console.log(this); });
Например, выведем значение всех элементов input на странице.
$("input").each(function() { console.log($(this).val()); });
Например, переберём все дочерние элементы, расположенные в ul с id="myList" (each children).
Рассмотрим способ, с помощью которого можно определить последний индекс (элемент) в методе jQuery each .
// выбираем элементы var myList = $("ul li"); // определяем количество элементом в выборке var total = myList.length; // осуществляем перебор выбранных элементов myList.each(function(index) { if (index === total - 1) { // это последний элемент в выборке } });
На данный момент есть три способа перебора элементов настоящего массива:
Кроме того, в скором времени, с появлением нового стандарта 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 и более ранние версии, которые до сих пор кое-где еще используются.
К достоинствам forEach относится то, что здесь не нужно объявлять локальные переменные для хранения индекса и значения текущего элемента массива, поскольку они автоматически передаются в функцию обратного вызова (колбек) в качестве аргументов.
Если вас беспокоят возможные затраты на вызов колбека для каждого элемента, не волнуйтесь и прочитайте это .
forEach предназначен для перебора всех элементов массива, но кроме него ES5 предлагает еще несколько полезных методов для перебора всех или некоторых элементов плюс выполнения при этом каких-либо действий с ними:
Старый добрый 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 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