Push javascript примеры. Массивы. Методы unshift() и shift()


Стек позволяет отнести к данным историю изменения значений переменных. Описание данных и алгоритмов лежит в основе программирования. Стек - это основа для передачи управления между функциями, организации рекурсии и ссылок на параметры. Синтаксис и семантика JavaScript посредством методов массива push() и pop() дают возможность манипулировать смыслом и учитывать фактор времени. Особенность языка браузера и его логика позволяют иначе взглянуть на возможности фактора времени.

Массив данных и логика его образования

Просто описать переменную. Несложно создать массив переменных. Алгоритм, использующий данные, - это статичное и простое решение задачи. Классическая работа с данными:

  • описать (создать) переменную;
  • присвоить значение;
  • изменить значение;
  • удалить переменную.

Функции push() и pop() позволяют изменить сущность переменных и их использование. Идея стека не изменилась с момента ее «рождения», но особенность JS как языка браузера и современной концепции программирования позволяет учесть фактор времени и придать данным динамику.

Функция value") - добавить что-то в конец массива. Функция - извлечь последний элемент массива. Указатель в контексте push/pop при добавлении перемещается на добавленный элемент, при извлечении - на предпоследний элемент, а последний элемент является результатом выполнения операции.

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

Движение по значениям

Суть стека - пришел последним, ушел первым. Нельзя извлечь значение вне данного порядка. Строго соблюдая это правило, рассматривая значения всего массива как одну переменную, можно получить динамику изменения значений этой переменной во времени.

В этом примере добавление значений JS array.push(...) - это одна последовательность действий, извлечение значений JS array pop() - другая последовательность. Оба варианта действий взаимосвязаны. Это означает, что активный элемент меняет свое значение не только по времени, но и по логике своего изменения.

Рекурсия и динамика значения

Если функция может вызвать саму себя и безопасно исполнить свое предназначение - это полная функциональность. Простой пример - таблица. В таблице могут быть и другие таблицы. А каждая таблица - это строчки, столбцы и ячейки. Каждая ячейка может содержать таблицу. Несколько ячеек по строке или по столбцу могут быть объединены в одну ячейку, в которой может находиться таблица. В таблице, находящейся в ячейке, может быть ячейка с двумя и более таблицами.

Реализовать сказанное в классическом стиле программирования практически невозможно, но в рекурсивном - элементарно. Если функциональность алгоритма работы с таблицей позволяет реализовать себя внутри любой ячейки - значит, это JS array push. На JavaScript этот «фокус» имеет особенный смысл. Таблицы - это пользовательское применение. Дерево страницы (DOM) - это работа на странице.

На элементах DOM (тегах страницы) висят обработчики. Один вариант, когда такой обработчик срабатывает один раз, совсем другой вариант, когда он может вызывать сам себя много раз. В разрезе всех обработчиков всех элементов страницы получается динамика страницы во времени.

Push/pop и рекурсия - это несколько иное представление о логике работы страницы: все меняется так, как требуется в текущей ситуации, а не программируется заранее в виде последовательной отработки действий посетителя.

В этой статье мы рассмотрим стандартные JavaScript массивы с числовыми индексами. Массивы объявляются с помощью квадратных скобок:

var fruits = ["Apple", "Orange", "Donkey"]

Чтобы извлечь элемент, поместите его индекс в квадратные скобки. Первый индекс 0 :

var fruits = ["Apple", "Orange", "Donkey"] alert(fruits) alert(fruits) alert(fruits)

Мы также можем получить длину массива JavaScript :

var fruits = ["Apple", "Orange", "Donkey"] alert(fruits.length)

Упс! Мы создали массив с двумя фруктами и ослом. Теперь нам нужно удалить осла.

Методы pop и push

Метод pop в JavaScript удаляет элемент массива и возвращает его.

В следующем примере показано, как «Осел » извлекается из массива:

var fruits = ["Apple", "Orange", "Donkey"] alert("Я удаляю "+fruits.pop()) // Теперь у нас только ["Apple","Orange"] alert("Теперь размер массива: "+fruits.length) // осел удален

Обратите внимание, что pop изменяет сам массив.

Аналог pop — это метод push , который добавляет элемент в массив. Например, мы забыли добавить персик:

var fruits = ["Apple", "Orange"] fruits.push("Peach"); // теперь у нас есть ["Apple", "Orange", "Peach"] alert("Последний элемент:"+fruits)

  1. Создайте массив styles с элементами “Jazz ”, “Blues ”;
  2. Добавьте значение «Rock’n’Roll «;
  3. Замените второе значение с конца значением «Classic «. У вас должен получиться массив: “Jazz ”, ”Classic ”, ”Rock’n’Roll ”. Код должен работать для любой длины массива;
  4. Извлеките последнее значение из массива и выведите его через alert .

Решение

// 1 var styles = ["Jazz", "Bluez"] // 2 styles.push("Rock"n"Roll") // или: styles = "Rock"n"Roll" // 3 styles = "Classic" // 4 alert(styles.pop())

Методы shift/unshift

Методы shift/unshift работают с концом массива, но вы также можете использовать shift , чтобы сдвинуть элементы вверх (первое значение массива удаляется со сдвигом элементов ). Метод unshift позволяет в JavaScript добавить элемент в массив с конца:

var fruits = ["Apple", "Orange"] var apple = fruits.shift() // теперь у нас остался только ["Orange"] fruits.unshift("Lemon") // теперь мы имеем ["Lemon", "Orange"] alert(fruits.length) // 2

И shift , и unshift могут работать с несколькими элементами одновременно:

var fruits = ["Apple"] fruits.push("Orange","Peach") fruits.unshift("Pineapple","Lemon") // теперь массив выглядит так: ["Pineapple", "Lemon", "Apple", "Orange", "Peach"]

Задание для самостоятельного выполнения

Напишите код, чтобы вывести через alert случайное значение из массива arr :

var arr = ["Plum","Orange","Donkey","Carrot","JavaScript"]

Примечание: Код для получения случайного числа от минимального до максимального значения (включительно ) следующий:

var rand = min + Math.floor(Math.random()*(max+1-min))

Решение

Нам нужно извлечь случайное число от 0 до arr.length-1 (включительно ):

var arr = ["Plum","Orange","Donkey","Carrot","JavaScript"] var rand = Math.floor(Math.random()*arr.length) alert(arr)

Перебор массива

В JavaScript перебор массива осуществляется с помощью цикла for :

var fruits = ["Pineapple", "Lemon", "Apple", "Orange", "Peach"] for(var i=0; i

Задание для самостоятельного выполнения

Создайте функцию find(arr,value) , которая находит значение в заданном массиве и возвращает его индекс или -1 , если значение не найдено.

Например:

arr = [ "test", 2, 1.5, false ] find(arr, "test") // 0 find(arr, 2) // 1 find(arr, 1.5) // 2 find(arr, 0) // -1

Решение

Возможное решение может выглядеть так:

function find(array, value) { for(var i=0; i

Но это неверно, потому что == не определяет разницу между 0 и false .

Более корректно при работе с массивами в JavaScript использовать === . Кроме того новейший стандарт ES5 содержит функцию Array#indexOf . С ее помощью мы можем определить функцию следующим образом:

function find(array, value) { if (array.indexOf) return array.indexOf(value) for(var i=0; i

Еще разумнее было бы определить find через условие, чтобы проверить, существует ли метод indexOf .

Задание для самостоятельного выполнения

Создайте функцию filterNumeric(arr) , которая принимает массив и возвращает новый массив, содержащий только числовые значения из arr .

Пример того, как это должно работать:

arr = ["a", 1, "b", 2]; arr = filterNumeric(arr); // теперь arr =

Решение

Решение заключается в том, чтобы перебрать массив и добавить значения в новый массив, если они являются числовыми.

join и split

Иногда нужен быстрый способ преобразовать JavaScript массив в строку. Именно для этого предназначен метод join .

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

var fruits = ["Lemon","Apple","Orange","Peach"]; var str = fruits.join(", "); alert(str);

Обратное преобразование легко выполняется с помощью метода split :

var fruits = "Apple,Orange,Peach"; var arr = fruits.split(","); // arr содержит теперь ["Apple", "Orange", "Peach"] alert(arr);

Задание для самостоятельного выполнения

Объект включает в себя свойство className , которое содержит имена классов, разделенные пробелами:

Напишите функцию addClass(obj, cls) , которая добавляет класс cls , но только если он не существует:

ddClass(obj, "new") // obj.className="open menu new" addClass(obj, "open") // без изменений (class already exists) addClass(obj, "me") // obj.className="open menu new me" alert(obj.className) //

Решение

Нужно разделить className и цикл на части. Если класс не найден, тогда он добавляется.

Цикл немного оптимизирован для увеличения производительности:

function addClass(elem, cls) { for(var c = elem.className.split(" "), i=c.length-1; i>=0; i--) { if (c[i] == cls) return } elem.className += " "+cls } var obj = { className: "open menu" } addClass(obj, "new") addClass(obj, "open") alert(obj.className) // open menu new

В приведенном выше примере переменная c определяется в начале цикла, и для ее последнего индекса задается значение i .

Сам цикл обрабатывается в обратном направлении, заканчиваясь условием i>=0 . Потому что i>=0 проверить быстрее, чем i . Что в JavaScript ускоряет поиск в массиве.

Использование length для обрезки массива

С помощью свойства length можно обрезать массив следующим образом:

Вы задаете длину, и браузер обрезает массив.

Array представляет собой объект, что из этого следует

На самом деле в JavaScript Array — это Object , дополненный автоматической установкой длины и специальными методами.

Это отличается от концепции в других языках, где массивы представляют собой непрерывный сегмент памяти. Это также отличается от очереди или стека на основе связанных списков.

Нечисловые ключи массива

Ключи — это числа, но они могут иметь любые имена:

arr = arr = 5 arr.prop = 10 // не делайте так

В JavaScript массивы представляют собой хэш-таблицы с их преимуществами в плане производительности, но и с определенными недостатками.

Например, push/pop работают только с крайними элементами массива, поэтому они невероятно быстры.

push работает только с концом:

var arr = ["My", "array"] arr.push("something") alert(arr) // строка "array"

Методы shift/unshift медленные, потому что им нужно изменить нумерацию всего массива. Метод splice также может привести к изменению нумерации:

Таким образом, shift/unshift работают медленнее, чем push/pop . Чем больше массив, тем больше времени занимает в JavaScript сортировка массива.

Задание для самостоятельного выполнения

Какой получится результат? Почему?

arr = ["a", "b"] arr.push(function() { alert(this) }) arr() // ?

Решение

Поскольку массивы являются объектами, arr.. фактически является вызовом метода объекта, таким как objmethod:

arr() // то же самое что arr() // синтаксически это неправильно, но концептуально то же самое: arr.2() // переписанное в том же стиле, что и obj.method() this = arr в таком случае передается функции, поэтому выводится содержимое arr. arr = ["a", "b"] arr.push(function() { alert(this) }) arr() // "a","b",функция

Разреженные массивы, описание length

Свойство length позволяет получить не размер массива в JavaScript , а последний индекс + 1 . Это важно, если речь идет о разреженных массивах, с «промежутками » в индексах.

В следующем примере мы добавим два элемента в пустые fruits , но значение length останется 100 :

var fruits = // пустой массив fruits = "Peach" fruits = "Apple" alert(fruits.length) // 100 (но элементов в массиве всего 2)

Если вы попытаетесь вывести разреженный массив, браузер выдаст значения пропущенных индексов как пустые элементы:

var fruits = // пустой массив fruits = "Peach" fruits = "Apple" alert(fruits) // ,Peach,Apple (или что-то вроде этого)

Но массив — это объект с двумя ключами. Недостающие значения не занимают места.

Разреженные массивы ведут себя причудливо, когда к ним применяются методы массива. Они понятия не имеют о том, что индексы пропущены:

var fruits = fruits = "Peach" fruits = "Apple" alert(fruits.pop()) // выталкиваем "Apple" (на индекс 9) alert(fruits.pop()) // выталкиваем не заданный элемент (на индекс 8)

Старайтесь избегать разреженных массивов. Во всяком случае, их методы не будут работать нормально. Вместо этого используйте Object .

Удаление из массива

Как мы знаем, массивы — это объекты, поэтому мы могли бы использовать delete , чтобы удалить значение:

var arr = ["Go", "to", "home"] delete arr // теперь arr = ["Go", undefined, "home"] alert(arr) // не задано

Вы видите, что значение удаляется, но не так, как мы хотели бы, потому что массив содержит незаданный элемент.

Оператор delete удаляет пару ключ-значение, и это все. Естественно, так как массив — это только хэш, позиция удаленного элемента становится undefined .

Чаще всего нам нужно удалить элемент, не оставляя «дыр » между индексами. Существует еще один метод, который поможет нам в этом.

Метод splice

Метод splice может удалять элементы и заменять их в JavaScript многомерных массивах. Его синтаксис:

arr.splice(index, deleteCount[, elem1, ..., elemN])

Удаляет элемент deleteCount , начиная с index , а затем вставляет на его место elem1, …, elemN .

Давайте рассмотрим несколько примеров:

var arr = ["Go", "to", "home"] arr.splice(1, 1) // удалить 1 элемент, начиная с индекса 1 alert(arr.join(",")) // ["Go", "home"] (1 элемент удален)

Таким образом, вы можете использовать splice , чтобы удалить один элемент из массива. Номера элементов массива сдвигаются, чтобы заполнить пробел:

var arr = ["Go", "to", "home"] arr.splice(0, 1) // удаляем 1 элемент, начиная с индекса 0 alert(arr) // "to" стал первым элементом

В следующем примере показано, как заменять элементы:

Метод splice возвращает массив удаленных элементов:

var arr = ["Go", "to", "home", "now"]; // удаляем 2 первых элемента var removed = arr.splice(0, 2) alert(removed) // "Go", "to" <-- массив удаленных элементов splice может вставлять элементы, задайте 0 для deleteCount. var arr = ["Go", "to", "home"]; // со второй позиции // удаляем 0 // и вставляем "my", "sweet" arr.splice(2, 0, "my", "sweet") alert(arr) // "Go", "to", "my", "sweet", "home"

Данный метод также может использовать отрицательный индекс, который отсчитывается с конца массива:

var arr = // для элемента -1 (предпоследнего) // удаляем 0 элементов, // и вставляем 3 и 4 arr.splice(-1, 0, 3, 4) alert(arr) // 1,2,3,4,5

Задание для самостоятельного выполнения

Объект содержит свойство className , в котором содержатся имена классов, разделенные пробелами:

var obj = { className: "open menu" }

Напишите функцию removeClass(obj, cls) , которая удаляет класс cls , если он задан:

removeClass(obj, "open") // obj.className="menu" removeClass(obj, "blabla") // без изменений (класса для удаления не существует)

Решение

Нужно разделить className на части и перебрать эти части через цикл. Если найдено совпадение, оно удаляется из JavaScript массива объектов, а затем добавляется обратно в конец.

Немного оптимизируем это:

function removeClass(elem, cls) { for(var c = elem.className.split(" "), i=c.length-1; i>=0; i--) { if (c[i] == cls) c.splice(i,1) } elem.className = c.join(" ") } var obj = { className: "open menu" } removeClass(obj, "open") removeClass(obj, "blabla") alert(obj.className) // menu

В приведенном выше примере переменная c задана в начале цикла, и для i задан ее последний индекс.

Сам цикл выполняется в обратном направлении, заканчиваясь условием i>=0 . Это сделано потому, что i>=0 проверяется быстрее, чем i . Что ускоряет поиск свойства в c .

Метод slice

Можно извлечь часть массива с помощью метода slice(begin[, end]): var arr = ["Why", "learn", "JavaScript"]; var arr2 = arr.slice(0,2) // принимает 2 элемента, начиная с 0 alert(arr2.join(", ")) // "Why, learn"

Обратите внимание, что этот метод не изменяет в JavaScript количество элементов в массиве, а копирует его часть.

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

var arr = ["Why", "learn", "JavaScript"]; var arr2 = arr.slice(1) // принимает все элементы, начиная с 1 alert(arr2.join(", ")) // "learn, JavaScript"

Метод поддерживает отрицательные индексы, так же, как String#slice .

Метод reverse

Еще один полезный метод — reverse . Предположим, я хочу получить последнюю часть домена, например, “com ” от “my.site.com ”. Вот как это можно сделать:

var domain = "my.site.com" var last = domain.split(".").reverse() alert(last)

Обратите внимание, что JavaScript массивы поддерживают сложный синтаксис (reverse()) для вызова метода, а затем извлечения элемента из полученного массива.

Вы можете создавать более длинные вызовы, например, reverse()0] arr.sort() alert(arr) // 1, 15, 2

Запустите приведенный выше код. Вы получите порядок 1 , 15 , 2 . Это потому, что метод преобразует все в строку и использует по умолчанию лексикографический порядок.

В JavaScript . Здесь мы продолжим знакомство с Массивами. Поговорим о свойстве length - как узнать: сколько же элементов содержит Массив?

Научимся добавлять элементы в начало и конец Массива - это методы unshift и push соответственно.

А также с помощью методов shift и pop сможем удалить элементы также из начала и конца Массива!

По сути, Массив - это некий объект, состоящий из определенного числа различных элементов.

Свойство length позволят узнать количество элементов в Массиве.

Для примера давайте возьмём Массив семи дней недели знакомый нам по прошлой теме .

Давайте узнаем и выведем на экран число элементов массива. Для этого необходимо, как Вы видите в примере ниже, создать переменную, значением которой будет интересующий нас массив, для которого, в свою очередь, указано свойство length .

array.length - такой код даёт нам число элементов Массива (где array - имя Массива) .

Таким образом, в переменную count мы поместили число, равное количеству элементов Массива.

Вот так работает свойство length .

Метод push - добавляет элемент в конец Массива .

Для того чтобы начать работу с методами добавления элементов, нужно создать какой-либо Массив.

Ниже я создал Массив «Друзья» - friends .

Сейчас нам необходимо добавить элемент, то есть ещё одно Имя в конец Массива.

Для этого существует метод push - он добавляет элемент в конец Массива. Это выглядит следующим образом:

Настя, Григорий, Вячеслав, Алексей, Яков

Яков

Для проверки работы метода push в примере выше, мы вывели количество элементов Массива friends при помощи свойства length - их стало 5. Затем вывели весь Массив friends , а также последний элемент Массива .

Теперь Вы можете сами убедиться, что элемент добавлен в конец Массива!

Метод unshift - добавляет элемент в начало Массива .

Здесь мы снова обратимся к Массиву friends .

Теперь нам нужно добавить элемент в начало Массива. Для этого существует метод unshift .

Количество элементов в Массиве равно 5

Борис , Настя, Григорий, Вячеслав, Алексей

Борис

Для проверки работы метода unshift мы вывели количество элементов Массива friends при помощи свойства length , потом вывели весь Массив friends , а также первый элемент Массива (напоминаем, что нумерация элементов Массива начинается с 0) .

Теперь, как видите, элемент добавлен в начало Массива!

Метод pop - удаляет последний элемент из Массива .

И снова работаем с Массивом «Друзья»

Используя метод pop - удаляем последний элемент из Массива :

Настя, Григорий, Вячеслав

Вячеслав

Для наглядности работы метода pop мы снова вывели количество элементов Массива при помощи свойства length , затем вывели весь Массив friends - уже без удалённого последнего элемента.

А также вывели последний элемент вновь получившегося Массива. Для вывода последнего элемента, воспользовавшись свойством length, мы взяли общее число оставшихся элементов в Массиве (3) и вычли из него 1. Таким образом, мы вывели последний элемент массива под номером 2. Но это третий элемент, так как нумерация в Массиве начинается с 0!!!

Метод shift - удаляет первый элемент из Массива .

Перед нами, как и ранее, Массивом «Друзья»

С помощью метода shift - удаляем первый элемент из Массива :

Количество элементов в Массиве равно 3

Григорий, Вячеслав, Алексей

Григорий

И, наконец, для проверки работы метода shift мы вывели количество элементов вновь получившегося Массива при помощи свойства length , затем вывели весь Массив friends - уже без удалённого первого элемента.

А также вывели первый элемент Массива . Нумерация в Массиве начинается с 0!!!

Напомню для Вас и для себя один интересный момент этой статьи!

Для того чтобы узнать номер/индекс последнего элемента Массива, нужно из числа его элементов (т.е. из ) Вычесть единицу!!!

Мы уже работали с этим в пункте темы .

Хорошим вариантом иллюстрации этого момента будет продолжение примера из пункта темы, где мы рассматривали Массив семи дней недели.

Количество элементов в Массиве days равно 7

Номером последнего элемента Массива является число 6

Итак, этим примером мы заодно ещё раз отметили тот факт, что нумерация в Массиве начинается с 0 . И, как видно из этого примера, номером 7-го элемента массива является число 6.

В конце этой темы также выполним домашнее задание. И снова попробуйте решить его самостоятельно.

Домашнее задание по удалению из... и добавлению элементов в Массив в Javascript имеет следующее содержание:

1. Создайте массив с фруктами: апельсин, банан, груша.
2. Выведите на экран, сколько на
данный момент у вас фруктов в массиве.
3. С помощью методов, изученных в предыдущем уроке, добавьте в конец массива два фрукта - яблоко и ананас, а в начало массива - грейпфрут.
4. Выведите на экран, сколько на данный момент у вас фруктов в массиве.
5. С помощью методов, изученных в предыдущем уроке, удалите из массива последний и первый элемент.
6. Выведите на экран, сколько на данный момент у вас фруктов в массиве.

Апельсин, Банан, Груша

Сейчас в моей корзине 3 фрукта

Грейпфрут, Апельсин, Банан, Груша, Яблоко, Ананас

Сейчас в моей корзине 6 фруктов

Апельсин, Банан, Груша, Яблоко

Сейчас в моей корзине 4 фрукта

The push() method adds one or more elements to the end of an array and returns the new length of the array.

The source for this interactive example is stored in a GitHub repository. If you"d like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.

Syntax

arr .push(element1 [, ...[, elementN ]])

Parameters

elementN The element(s) to add to the end of the array.

Return value

Examples

Adding elements to an array

The following code creates the sports array containing two elements, then appends two elements to it. The total variable contains the new length of the array.

Let sports = ["soccer", "baseball"] let total = sports.push("football", "swimming") console.log(sports) // ["soccer", "baseball", "football", "swimming"] console.log(total) // 4

Merging two arrays

This example uses apply() to push all elements from a second array.

Do not use this method if the second array (moreVegs in the example) is very large, because the maximum number of parameters that one function can take is limited in practice. See apply() for more details.

Let vegetables = ["parsnip", "potato"] let moreVegs = ["celery", "beetroot"] // Merge the second array into the first one // Equivalent to vegetables.push("celery", "beetroot") Array.prototype.push.apply(vegetables, moreVegs) console.log(vegetables) // ["parsnip", "potato", "celery", "beetroot"]

Using an object in an array-like fashion

As mentioned above, push is intentionally generic, and we can use that to our advantage. Array.prototype.push can work on an object just fine, as this example shows.

Note that we don"t create an array to store a collection of objects. Instead, we store the collection on the object itself and use call on Array.prototype.push to trick the method into thinking we are dealing with an array-and it just works, thanks to the way JavaScript allows us to establish the execution context however we please.

Let obj = { length: 0, addElem: function addElem(elem) { // obj.length is automatically incremented // every time an element is added. .push.call(this, elem) } } // Let"s add some empty objects just to illustrate. obj.addElem({}) obj.addElem({}) console.log(obj.length) // → 2

Note that although obj is not an array, the method push successfully incremented obj "s length property just like if we were dealing with an actual array.

Specifications

Specification Status Comment
ECMAScript 3rd Edition (ECMA-262) Standard Initial definition. Implemented in JavaScript 1.2.
ECMAScript 5.1 (ECMA-262)
Standard
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of "Array.prototype.push" in that specification.
Standard
ECMAScript Latest Draft (ECMA-262)
The definition of "Array.prototype.push" in that specification.
Draft

Browser compatibility

The compatibility table in this page is generated from structured data. If you"d like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

Desktop Mobile Server
Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet Node.js
push Chrome Full support 1 Edge Full support 12 Firefox Full support 1 IE Full support 5.5 Opera Full support Yes Safari Full support 1 WebView Android Full support Yes Chrome Android Full support 18 Firefox Android Full support 4 Opera Android Full support Yes Safari iOS Full support 1 Samsung Internet Android Full support Yes nodejs Full support Yes

С массивами можно работать посредством различных методов, предоставляемых конструктором Array.

Методы pop/push и shift/unshift

Рассмотрим методы pop() и push(). Эти методы позволяют работать с массивами как со стеками. Стек - это структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last in - first out, «последним пришёл - первым ушел»). Принцип работы стека можно сравнить со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю. Как это работает изображено на рисунке:

И так вернемся к рассмотрению методов push() и pop(). Метод push() добавляет один или несколько новых элементов в конец массива и возвращает его новую длину. Метод pop() - удаляет последний элемент массива, уменьшает длину массива и возвращает удаленное им значение. Стоит обратить внимание на то, что оба эти метода изменяют массив на месте, а не создают его модифицированную копию.

Var foo = ; // foo: foo.push(1,2); // foo: Возвращает 2 foo.pop(); // foo: Возвращает 2 foo.push(3); // foo: Возвращает 2 foo.pop(); // foo: Возвращает 3 foo.push(); // foo: ] Возвращает 2 foo.pop() // foo: Возвращает foo.pop(); // foo: Возвращает 1 var fruits = ["груши", "бананы", "яблоки"]; var picked = fruits.pop(); document.write("Вы сорвали мои " + picked); Попробовать »

Методы shift() и unshift() ведут себя во многом также, как pop() и push(), за исключением того, что они вставляют и удаляют элементы в начале массива. Метод unshift() смещает существующие элементы в сторону больших индексов для освобождения места под новые элементы, добавляет один или несколько элементов в начало массива и возвращает новую длину массива. Метод shift() удаляет первый элемент массива и возвращает его значение, смещая все последующие элементы для занятия свободного места в начале массива.

Var f = ; // f: f.unshift(1); // f: Возвращает: 1 f.unshift(22); // f: Возвращает: 2 f.shift(); // f: Возвращает: 22 f.unshift(3,); // f:,1] Возвращает: 3 f.shift(); // f:[,1] Возвращает: 3 f.shift(); // f: Возвращает: f.shift(); // f: Возвращает: 1

Метод join

Метод Array.join() используется для объединения элементов массива в одну строку. Методу можно передать необязательный строковой аргумент, который будет использоваться для разделения элементов в строке. Если разделитель не задан, то при вызове метода символом-разделителем по умолчанию будет запятая.

Var a = ["Ветер","Дождь","Огонь"]; var myVar1 = a.join(); //"Ветер,Дождь,Огонь" var myVar2 = a.join(", "); //"Ветер, Дождь, Огонь" var myVar3 = a.join(" + "); //"Ветер + Дождь + Огонь" document.write(myVar1 + "
" + myVar2 + "
" + myVar3); Попробовать »

Метод Array.join() является обратным по отношению к методу String.split(), который создает массив путем разбиения строки на фрагменты.

Метод reverse

Метод Array.reverse() меняет порядок следования элементов в массиве на противоположный и возвращает массив с переставленными элементами. Этот метод не создает новый массив с переупорядоченными элементами, а переупорядочивает их в уже существующем массиве.

Var myArr = ["один", "два", "три"]; document.write(myArr.reverse()); Попробовать »

Метод concat

Метод Array.concat() создает и возвращает новый массив, содержащий элементы исходного массива, для которого был вызван метод concat(), последовательно дополненный значениями всех аргументов, переданных методу concat(). Если какой-либо из этих аргументов сам является массивом, тогда будут добавлены все его элементы. Имена массивов используются в качестве аргументов и указываются в том порядке, в котором нужно объединить их элементы.

Var a = ; a.concat(4, 5) //Возвращает a.concat(); //тоже самое - возвращает a.concat(,) //Возвращает

Метод sort

Метод Array.sort() на месте сортирует элементы массива и возвращает отсортированный массив. Если метод sort() вызывается без аргумента, то он сортирует элементы массива в алфавитном порядке (временно преобразует их в строки для выполнения сравнения). В качестве аргумента метод sort() может принимать функцию сравнения, которая определяет порядок сортировки элементов.

Var a = ["Киви", "Апельсины", "Груши"]; a.sort(); var s = a.join(", "); //Апельсины, Груши, Киви document.write(s); //пример с числами var myArr = ; myArr.sort(); document.write(myArr); //1,10,2 Попробовать »

Наверное от сортировки чисел вы ожидали увидеть немного другой результат. Такая сортировка произошла потому, что метод sort() сортирует элементы, преобразуя их в строки. Поэтому и порядок у них получается строковой - ведь "10"

Для сортировки в каком-либо ином порядке, отличном от алфавитного, можно передать методу sort() в качестве аргумента функцию сравнения. Следует однако учесть, что функцию сравнения придется писать самим. Эта функция должна иметь два параметра, так как она устанавливает, какой из двух ее аргументов должен присутствовать раньше в отсортированном списке. Чтобы было легче разобраться и написать такую функцию, есть несколько правил, по которым будет определяться порядок элементов:

  • Если первый аргумент должен предшествовать второму, функция сравнения возвращает отрицательное число (если a
  • Если первый аргумент должен следовать за вторым, то функция сравнения возвращает положительное число (если a > b)
  • Если два значения эквивалентны (т. е. порядок их расположения не важен), функция сравнения возвращает 0 (если a == b)

Для сравнения в качестве своих аргументов функция использует элементы массива:

Function foo(a,b) { //определяем функцию проверки if (a b) return 1; return 0; //если a == b } var a = ; a.sort(foo); //в качестве аргумента передается только имя функции document.write(a.join(", ")); //тоже самое записать более коротко var a = ; a.sort(function(a,b) { //используем анонимную функцию return a - b; //функция возвращает значение 0 }); document.write(a); //1,2,5,10 Попробовать »

Первая запись в примере написана так, для того, чтобы было легче понять, как это работает. Обратите внимание, насколько удобно использовать во втором фрагменте анонимную функцию. Она вызывается только один раз, поэтому нет необходимости давать ей имя.

Примечание: Если в массиве есть неопределенные элементы (undefined), они переносятся в конец массива.

Метод slice

Метод Array.slice() используется для копирования указанного участка из массива и возвращает новый массив содержащий скопированные элементы. Исходный массив при этом не меняется.

Синтаксис метода:

Имя_массива.slice(begin, end);

Имя_массива следует заменить именем того массива, из которого нужно извлечь определенный набор элементов для нового массива. Метод принимает два аргумента, которые определяют начало и конец возвращаемого участка массива. Метод копирует участок массива, начиная от begin до end, не включая end. Если указан только один аргумент, возвращаемый массив будет содержать все элементы от указанной позиции до конца массива. Можно использовать отрицательные индексы - они отсчитываются с конца массива.

Var arr = ; arr.slice(0,3); //Возвращает arr.slice(3); //Возвращает arr.slice(1,-1); //Возвращает arr.slice(-3,-2); //Возвращает

Метод splice

Метод Array.splice() - это универсальный метод для работы с массивами. Он изменяет массив на месте, а не возвращает новый измененный массив, как это делают методы slice() и concat(). Метод splice может удалять элементы из массива, вставлять новые элементы, заменять элементы - по очереди и одновременно. Он возвращает массив, состоящий из удаленных элементов, если ни один из элементов не был удален, вернет пустой массив.

Синтаксис метода:

Имя_массива.splice(index , кол-во, elem1, ..., elemN);

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

Var fruits = ["апельсины", "яблоки", "груши", "виноград"]; var deleted = fruits.splice(2,2); //возвращает ["груши", "виноград"] document.write(deleted); var arr = ; arr.splice(4); //Возвращает ; массив стал: arr.splice(1,2); //Возвращает ; массив стал: arr.splice(1,1); //Возвращает ; массив стал: Попробовать »

Первые два аргумента метода splice() задают элементы массива, подлежащие удалению. За этими двумя аргументами может следовать любое количество дополнительных аргументов, задающих элементы, которые будут вставлены в массив, начиная с позиции, заданной первым аргументом.

Var fruits = ["апельсины", "яблоки"]; fruits.splice(2,0, "арбузы"); //возвращает document.write(fruits); //стало ["апельсины", "яблоки", "арбузы"] var arr = ; arr.splice(2,0,"a","b"); //Возвращает ; стало arr.splice(2,2,); //Возвращает ["a","b"]; стало ,3,4,5] Попробовать »

Стоит обратить внимание, что в отличие от concat(), метод splice() не разбивает на отдельные элементы массивы, передаваемые в качестве аргументов. То есть, если методу передается массив для вставки, он вставляет сам массив, а не элементы этого массива.

Метод toString

Метод toString() преобразует элементы массива в строку, используя в качестве символа-разделителя запятую.

Var arr = ["Молоко","Хлеб","Печенье"]; var food = arr.toString(); document.write(food); //Молок,Хлеб,Печенье Попробовать »

Обратите внимание, метод возвращает ту же строку, что и метод join() при вызове его без аргументов.

indexOf и lastIndexOf

Метод indexOf возвращает индекс элемента, значение которого равно значению, переданному методу в качестве аргумента.

Синтаксис методов indexOf() и lastIndexOf():

Имя_массива.indexOf(искомый_элемент, индекс) имя_массива.lastIndexOf(искомый_элемент, индекс)

Первый аргумент метода указывает значение элемента, индекс которого нужно найти, второй аргумент (необязательный), указывает индекс с которого будет начинаться поиск. Если одинаковых вхождений несколько, выбирается наименьший (первый) индекс. Если элемент с искомым значением не найден, метод вернет -1. Внутри метода для поиска используется строгое сравнение (===).

Var a = ; a.indexOf(3); //вернет 2 a.indexOf(3,4); //вернет 6 a.indexOf(35); //вернет -1: нет элемента с таким значением a.indexOf(2); // 1

Метод lastIndexOf() тоже возвращает индекс элемента, значение которого равно значению, переданному методу в качестве аргумента. Разница лишь в том, что метод lastIndexOf() выбирает наибольший (последний) индекс.

Var a = ; a.lastIndexOf(3); //вернет 7 a.lastIndexOf(35); //вернет -1: нет элемента с таким значением a.lastIndexOf(2); // 6

Методы итераторы

Методы, описанные ниже, являются итераторами. Во всех современных браузерах для работы с массивами есть методы, которые предназначены для перебора элементов и выполнения различных действий над ними. Это методы forEach(), map(), filter(), every(), some, reduce() и reduceRight().

Они перебирают элементы массива начиная с 0 до length - 1 и, если элемент существует, передают его в callback обработчик-функцию.

forEach

Синтаксис метода:

Имя_массива.forEach(callback, thisArg)

В качестве первого аргумента указывается callback-функция, которую метод forEach() будет вызывать для каждого элемента массива. Реализацию вызываемой функции-обработчика нужно писать самим. Вызываемая функция должна иметь три параметра: первый параметр принимает в качестве аргумента - значение элемента массива, второй - индекс элемента, и третий - сам массив. Однако, если нужно использовать только значения элементов массива, можно написать функцию только с одним параметром. Второй аргумент - thisArg (необязательный) будет передан в качестве значения this.

Var arr = ; function foo(value) { var sum = value * this; return document.write(sum + "
"); } arr.forEach(foo, 5); //второй аргумент будет передан в качестве значения this //пример с тремя параметрами var a = ; a.forEach(function(el, idx, a) { document.write("a["+idx+"] = "+el+" в ["+a+"]
"); }); Попробовать »

filter

Синтаксис метода:

Имя_массива.filter(callback, thisObject)

Метод filter() создает и возвращает новый массив, который будет содержать только те элементы массива, для которых вызов функции callback возвратит true.

Function isBig(element, index, array) { //возвращает числа, которые больше или равны 10 return (element >= 10); //если значение элемента больше или равно 10 - выражение вернет true } var filtered = .filter(isBig); //filtered

map

Метод map() создает и возвращает новый массив, который будет состоять из результатов вызова функции callback(item, idx, ar) для каждого элемента массива.

Var a = ; var b = a.map(function(item, idx, arr) { return item * item; }); // b =

every и some

Метод every() возвращает true, если для всех элементов массива указанная функция, используемая для их проверки, вернет true.

Метод some() возвращает true, если во время проверки в указанной функции один или несколько элементов вернут true.

Var a = ; a.every(function(x) { return x 10; }) //true: одно число > 10

reduce и reduceRight

Синтаксис методов:

Имя_массива.reduce(callback, initialValue) имя_массива.reduceRight(callback, initialValue)

Метод reduce() применяет указанную функцию (callback) в отношении сразу двух значений в массиве, перебирая элементы слева направо, сохраняя при этом промежуточный результат.

Аргументы функции callback: (previousValue, currentItem, index, array)

  • previousValue - возвращаемый результат callback функции (он же промежуточный результат)
  • currentItem - текущий элемент массива (элементы перебираются по очереди слева-направо)
  • index - индекс текущего элемента
  • array - обрабатываемый массив

initialValue (инициализирующее значение) - объект, используемый в качестве первого аргумента первого вызова функции callback. Проще говоря, значение previousValue при первом вызове равно initialValue. Если initialValue нет, то оно равно первому элементу массива, а перебор начинается со второго:

Var a = ; function foo(prevNum,curNum) { sum = prevNum + curNum; alert(sum); return sum; } var result = a.reduce(foo, 0); document.write(result); Попробовать »

Разберем как работает этот пример. Первыми аргументами функции foo являются:

  • prevNum = 0 (так как initialValue - 0)
  • curNum = 1 (текущий элемент - 1-ый элемент массива)

К числу 0 прибавляется 1. Этот результат (sum: 1) будет передан как prevNum при следующем запуске функции. И так далее пока не дойдет до последнего элемента. Возвращенный результат - сумма от последнего запуска, составит 15 (1+2+3+4+5).

Метод reduceRight работает аналогично методу reduce, но идет по массиву справа-налево:

Var a = ["h","o","m","e"]; function bar(prevStr, curItem) { return prevStr + curItem; } document.write(a.reduceRight(bar)); //emoh

Выбор редакции