Как создать ассоциативный массив в JavaScript. Все способы перебора массива в JavaScript Явное использование итератора

Последнее обновление: 26.03.2018

Объект Array представляет массив и предоставляет ряд свойств и методов, с помощью которых мы можем управлять массивом.

Инициализация массива

Можно создать пустой массив, используя квадратные скобки или конструктор Array:

Var users = new Array(); var people = ; console.log(users); // Array console.log(people); // Array

Можно сразу же инициализировать массив некоторым количеством элементов:

Var users = new Array("Tom", "Bill", "Alice"); var people = ["Sam", "John", "Kate"]; console.log(users); // ["Tom", "Bill", "Alice"] console.log(people); // ["Sam", "John", "Kate"]

Можно определить массив и по ходу определять в него новые элементы:

Var users = new Array(); users = "Tom"; users = "Kate"; console.log(users); // "Tom" console.log(users); // undefined

При этом не важно, что по умолчанию массив создается с нулевой длиной. С помощью индексов мы можем подставить на конкретный индекс в массиве тот или иной элемент.

length

Чтобы узнать длину массива, используется свойство length :

Var fruit = new Array(); fruit = "яблоки"; fruit = "груши"; fruit = "сливы"; document.write("В массиве fruit " + fruit.length + " элемента:
"); for(var i=0; i < fruit.length; i++) document.write(fruit[i] + "
");

По факту длиной массива будет индекс последнего элемента с добавлением единицы. Например:

Var users = new Array(); // в массиве 0 элементов users = "Tom"; users = "Kate"; users = "Sam"; for(var i=0; i 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
$("ul#myList").children().each(function(){ console.log($(this).text()); }); // Результат: // HTML // CSS // JavaScript

Рассмотрим способ, с помощью которого можно определить последний индекс (элемент) в методе jQuery each .

// выбираем элементы var myList = $("ul li"); // определяем количество элементом в выборке var total = myList.length; // осуществляем перебор выбранных элементов myList.each(function(index) { if (index === total - 1) { // это последний элемент в выборке } });

Определение и применение

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 = ; var sum = 0 ; // инициализируем переменную, содержащую числовое значение array .forEach(// перебираем все элементы массива array function sumNumber(currentValue ) { sum += currentValue ; } ); console .log(sum ); // выводим значение переменной sum равное 50

В следующем примере мы рассмотрим использование второго аргумента метода forEach() , который указывает на объект, на который мы можем ссылаться с использованием ключевого слова this внутри функции обратного вызова:

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 (неявное использование итератора)
  • Явное использование итератора
  • II. Перебор массивоподобных объектов
  • Использование способов перебора настоящих массивов
  • Преобразование в настоящий массив
  • Замечание по объектам среды исполнения
I. Перебор настоящих массивов

На данный момент есть три способа перебора элементов настоящего массива:

  • метод Array.prototype.forEach ;
  • классический цикл for ;
  • «правильно» построенный цикл for...in .
  • Кроме того, в скором времени, с появлением нового стандарта ECMAScript 6 (ES 6), ожидается еще два способа:

  • цикл for...of (неявное использование итератора);
  • явное использование итератора.
  • 1. Метод forEach и родственные методы

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

    Пример использования:

    Var a = ["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 = ["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

    Принтер