Руководство по javascript, часть 5: массивы и циклы
Содержание:
- Создание (объявление) массива
- Ассоциативные массивы
- Копирование массива в JavaScript
- Работа с массивами JS — удаление из массива
- Array Methods
- Declaration
- Чтение и запись элементов массива
- Array Methods
- Методы Array
- Нарезка массива
- reduce/reduceRight
- Методы перебирающие массив в ECMAScript 5
- JS Учебник
- Удаление элемента по индексу в JavaScript
- Итого
Создание (объявление) массива
Массивы очень удобны, потому что в них можно хранить столько данных, сколько нужно. Максимально возможный размер js-массива— 232 элемента.
Нужно сказать JavaScript, что мы хотим создать именно массив. Для этого есть два варианта: значение в квадратных скобках или ключевое слово new.
Короткая запись: при помощи квадратных скобок
Заключённый в квадратные скобки список значений, разделённых запятыми.
var myArray = ;
Содержимое массива определяется тем, что находится между квадратными скобками. При этом каждое значение отделяется запятой.
Значения задаются так же, как и простые переменные, то есть строки нужно объявлять заключёнными в кавычки и т.д.
Чтобы объявить пустой массив, оставьте скобки пустыми:
var myArray = [];
Длинная запись: при помощи конструктора Array()
var lostArray = new Array("Джек", "Сойер", "Джон", "Дезмонд" ); var twinPeaksArray = new Array("Лора", 2, );
Ключевое слово new говорит JavaScript создать новый массив, значения которого передаются как параметры.
Если вы заранее знаете, сколько элементов будет в вашем массиве, можно сразу передать это значение в конструкторе.
var myArray = new Array(80);
Выражение, приведенное выше, создаст пустой массив, состоящий из 80 слотов со значениями undefined.
Объявление пустого массива:
var myArray = new Array();
Доступ к элементам массива
С помощью индекса каждого элемента можно работать с любыми данными в массиве, обращаясь к ним при помощи оператора []:
var myArray = ; console.log(myArray); // Выводит “Джек” console.log(myArray); // Выводит “Дезмонд”
В массиве может быть несколько уровней, то есть каждый элемент может сам быть массивом. В итоге получится двумерный js-массив. Как же обратиться к этим массивам, которые располагаются внутри других — «многомерным массивам»?
Для примера давайте рассмотрим массив, представляющий семью. Дети из этой семьи записаны отдельным массивом внутри главного:
var familyArray = ];
Можно представить его следующим образом:
1 | 2 | ||
Мардж | Гомер | 1 | 2 |
Барт | Лиза | Мэгги |
Что делать, если мы хотим обратиться к значению «Лиза»? Можно обозначить позицию «Лизы» оранжевым: это индекс 1 внутри массива, расположенного на индексе 2 главного массива:
1 | 2 | ||
Мардж | Гомер | 1 | 2 |
Барт | Лиза | Мэгги |
Для обращения к значению «Лиза»:
var lisa = familyArray; console.log(lisa); // выводит «Лиза»
Так можно продолжать практически бесконечно, что позволяет хранить в массивах вложенные друг в друга наборы данных и обращаться к ним при помощи индексов.
Как добавить элемент в массив JS
Мы разобрались, как обращаться к элементам массива при помощи соответствующих им индексов. Похожим образом можно добавлять (или изменять) элементы, объявляя, например:
var myArray = ; myArray = "Джулиет"; console.log(myArray); // Выводит "Кейт, Сун, Джулиет"
В примере, приведенном выше, я добавил индекс 2 со значением «Джулиет», которого до этого не было.
Что произойдёт, если я объявлю элемент с индексом, перед которым нет других элементов? Массив сам создаст все недостающие элементы и присвоит им значение undefined:
var myArray = ; myArray = "Джулиет"; console.log(myArray.length); // Выводит «6» console.log(myArray); // Prints
Узнать какова длина js-массива можно, воспользовавшись свойством length. В примере, приведенном выше, в массиве шесть элементов, и для трёх из них не было задано значение — они обозначены как undefined.
Метод push()
С помощью метода push() можно добавить в js-массив один или несколько элементов. Push() принимает неограниченное количество параметров, все они будут добавлены в конец массива.
var myArray = ; myArray.push("Джулиет"); // Добавляет в конец массива элемент "Джулиет" myArray.push("Либби", "Шеннон");// Добавляет в конец массива элементы "Либби" и "Шеннон" console.log(myaArray); // Prints
Метод unshift()
Метод unshift() работает также как и push(), только добавляет элементы в начало массива.
var myArray = ; myArray.unshift("Джулиет"); // Добавляет в начало массива элемент "Джулиет" myArray.unshift("Либби", "Шеннон"); // Добавляет в начало массива элементы "Либби" и "Шеннон" console.log(myArray); // Выводит
Ассоциативные массивы
Многие языки программирования поддерживают массивы с именованными индексами.
Массивы с именованными индексами называются ассоциативными массивами (или хэшами).
JavaScript не поддерживает массивы с именованными индексами.
В JavaScript массивы всегда используют пронумерованные индексы.
Пример
var person = [];
person = «John»;
person = «Doe»;
person = 46;var x = person.length;
// person.length will return 3var y = person;
// person will return «John»
Предупреждение!!При использовании именованных индексов JavaScript будет переопределять массив в стандартный объект.После этого некоторые методы и свойства массива будут давать неверные результаты.
Пример:
var person = [];
person = «John»;
person = «Doe»;
person = 46;var x = person.length; // person.length will
return 0var y = person;
// person will return undefined
Копирование массива в JavaScript
slice()
В JS копирование массива бывает поверхностным либо неглубоким (shallow copy) а также deep copy, то есть глубоким.
В первом случае мы присваиваем переменной значение другой переменной, хранящей массив:
var users = "Tom", "Bob", "Bill"]; console.log(users); // var people = users; // shallow copy people1 = "John"; // меняем 2-й элемент console.log(users); //
В нашем случае переменная people после неглубокого копирования станет указывать на тот же массив, что и переменная users. Именно поэтому в случае изменения элементов в people, поменяются элементы и в users, ведь по факту это один и тот же массив.
Вышеописанное поведение не всегда желательно. К примеру, нам надо, чтобы после копирования переменные указывали на отдельные массивы. Тогда подойдёт глубокое копирование посредством метода slice():
var users = "Tom", "Bob", "Bill"]; console.log(users); // var people = users.slice(); // deep copy people1 = "John"; // меняем 2-й элемент console.log(users); // console.log(people); //
Теперь после копирования переменные станут указывать на разные массивы, поэтому мы сможем менять их отдельно друг от друга.
Кроме того, функция slice() даёт возможность копировать часть массива:
var users = "Tom", "Bob", "Bill", "Alice", "Kate"]; var people = users.slice(1, 4); console.log(people); //
В функцию slice() мы передаём начальный и конечный индексы, используемые для выборки значений из нашего массива. В таком случае выборка в новый массив начнётся с первого индекса по индекс № 4, не включая его. И, так как индексация массивов в JavaScript начинается с нуля, в новом массиве будут 2-й, 3-й и 4-й элементы.
push()
Функция push() добавит элемент в конец нашего массива:
var fruit = []; fruit.push("груши"); fruit.push("яблоки"); fruit.push("сливы"); fruit.push("вишни","абрикосы"); document.write("В массиве fruit " + fruit.length + " элемента: <br/>"); document.write(fruit); // груши,яблоки,сливы,вишни,абрикосы
pop()
Такая функция, как pop(), удалит последний элемент из JavaScript-массива:
var fruit = "груши", "яблоки", "сливы"]; var lastFruit = fruit.pop(); // из массива извлекается последний элемент document.write(lastFruit + "<br/>"); document.write("В массиве fruit " + fruit.length + " элемента: <br/>"); for(var i=; i <fruit.length; i++) document.write(fruiti + "<br/>");
Итоговый вывод:
сливы В массиве fruit 2 элемента: груши яблоки
shift()
Теперь рассмотрим функцию shift(). Она может извлекать и удалять 1-й элемент из массива:
var fruit = "груши", "яблоки", "сливы"]; var firstFruit = fruit.shift(); document.write(firstFruit + "<br/>"); document.write("В массиве fruit " + fruit.length + " элемента: <br/>"); for(var i=; i <fruit.length; i++) document.write(fruiti + "<br/>");
Вывод следующий:
груши В массиве fruit 2 элемента: яблоки сливы
unshift()
Что касается функции unshift(), то она добавит новый элемент в самое начало массива:
var fruit = "груши", "яблоки", "сливы"]; fruit.unshift("апельсины"); document.write(fruit);
Вывод браузера:
апельсины,груши,яблоки,сливы
Работа с массивами JS — удаление из массива
Как мы знаем, массивы — это объекты, поэтому мы могли бы использовать delete, чтобы удалить значение:
var arr = delete arr // теперь arr = alert(arr) // не задано
Вы видите, что значение удаляется, но не так, как мы хотели бы, потому что массив содержит незаданный элемент.
Оператор delete удаляет пару ключ-значение, и это все. Естественно, так как массив — это только хэш, позиция удаленного элемента становится undefined.
Чаще всего нам нужно удалить элемент, не оставляя «дыр» между индексами. Существует еще один метод, который поможет нам в этом.
Метод splice
Метод splice может удалять элементы и заменять их в JavaScript многомерных массивах. Его синтаксис:
arr.splice(index, deleteCount)
Удаляет элемент deleteCount, начиная с index, а затем вставляет на его место elem1, …, elemN.
Давайте рассмотрим несколько примеров:
var arr = arr.splice(1, 1) // удалить 1 элемент, начиная с индекса 1 alert( arr.join(',') ) // (1 элемент удален)
Таким образом, вы можете использовать splice, чтобы удалить один элемент из массива. Номера элементов массива сдвигаются, чтобы заполнить пробел:
var arr = arr.splice(0, 1) // удаляем 1 элемент, начиная с индекса 0 alert( arr ) // "to" стал первым элементом
В следующем примере показано, как заменять элементы:
var arr = ; // remove 3 first elements and add two arr.splice(0, 3, "Come", "here") alert( arr ) //
Метод splice возвращает массив удаленных элементов:
var arr = ; // удаляем 2 первых элемента var removed = arr.splice(0, 2) alert( removed ) // "Go", "to" <-- массив удаленных элементов splice может вставлять элементы, задайте 0 для deleteCount. var arr = ; // со второй позиции // удаляем 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 == 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.
Array Methods
Method | Description |
---|---|
concat() | Joins two or more arrays, and returns a copy of the joined arrays |
copyWithin() | Copies array elements within the array, to and from specified positions |
entries() | Returns a key/value pair Array Iteration Object |
every() | Checks if every element in an array pass a test |
fill() | Fill the elements in an array with a static value |
filter() | Creates a new array with every element in an array that pass a test |
find() | Returns the value of the first element in an array that pass a test |
findIndex() | Returns the index of the first element in an array that pass a test |
forEach() | Calls a function for each array element |
from() | Creates an array from an object |
includes() | Check if an array contains the specified element |
indexOf() | Search the array for an element and returns its position |
isArray() | Checks whether an object is an array |
join() | Joins all elements of an array into a string |
keys() | Returns a Array Iteration Object, containing the keys of the original array |
lastIndexOf() | Search the array for an element, starting at the end, and returns its position |
map() | Creates a new array with the result of calling a function for each array element |
pop() | Removes the last element of an array, and returns that element |
push() | Adds new elements to the end of an array, and returns the new length |
reduce() | Reduce the values of an array to a single value (going left-to-right) |
reduceRight() | Reduce the values of an array to a single value (going right-to-left) |
reverse() | Reverses the order of the elements in an array |
shift() | Removes the first element of an array, and returns that element |
slice() | Selects a part of an array, and returns the new array |
some() | Checks if any of the elements in an array pass a test |
sort() | Sorts the elements of an array |
splice() | Adds/Removes elements from an array |
toString() | Converts an array to a string, and returns the result |
unshift() | Adds new elements to the beginning of an array, and returns the new length |
valueOf() | Returns the primitive value of an array |
❮ Previous
Next ❯
Declaration
There are two syntaxes for creating an empty array:
Almost all the time, the second syntax is used. We can supply initial elements in the brackets:
Array elements are numbered, starting with zero.
We can get an element by its number in square brackets:
We can replace an element:
…Or add a new one to the array:
The total count of the elements in the array is its :
We can also use to show the whole array.
An array can store elements of any type.
For instance:
Trailing comma
An array, just like an object, may end with a comma:
The “trailing comma” style makes it easier to insert/remove items, because all lines become alike.
Чтение и запись элементов массива
Доступ к элементам массива осуществляется с помощью оператора []. Слева от скобок должна присутствовать ссылка на массив. Внутри скобок должно находиться произвольное выражение, возвращающее неотрицательное целое значение. Этот синтаксис пригоден как для чтения, так и для записи значения элемента массива. Следовательно, допустимы все приведенные далее JavaScript-инструкции:
Напомню, что массивы являются специализированной разновидностью объектов. Квадратные скобки, используемые для доступа к элементам массива, действуют точно так же, как квадратные скобки, используемые для доступа к свойствам объекта. Интерпретатор JavaScript преобразует указанные в скобках числовые индексы в строки — индекс 1 превращается в строку «1» — а затем использует строки как имена свойств.
В преобразовании числовых индексов в строки нет ничего особенного: то же самое можно проделывать с обычными объектами:
Особенность массивов состоит в том, что при использовании имен свойств, которые являются неотрицательными целыми числами, массивы автоматически определяют значение свойства length. Например, выше был создан массив arr с единственным элементом. Затем были присвоены значения его элементам с индексами 1, 2 и 3. В результате этих операций значение свойства length массива изменилось и стало равным 4.
Следует четко отличать индексы в массиве от имен свойств объектов. Все индексы являются именами свойств, но только свойства с именами, представленными целыми числами являются индексами. Все массивы являются объектами, и вы можете добавлять к ним свойства с любыми именами. Однако если вы затрагиваете свойства, которые являются индексами массива, массивы реагируют на это, обновляя значение свойства length при необходимости.
Обратите внимание, что в качестве индексов массивов допускается использовать отрицательные и не целые числа. В этом случае числа преобразуются в строки, которые используются как имена свойств
Array Methods
In JavaScript, there are various array methods available that makes it easier to perform useful calculations.
Some of the commonly used JavaScript array methods are:
Method | Description |
---|---|
concat() | joins two or more arrays and returns a result |
indexOf() | searches an element of an array and returns its position |
find() | returns the first value of an array element that passes a test |
findIndex() | returns the first index of an array element that passes a test |
forEach() | calls a function for each element |
includes() | checks if an array contains a specified element |
push() | aads a new element to the end of an array and returns the new length of an array |
unshift() | adds a new element to the beginning of an array and returns the new length of an array |
pop() | removes the last element of an array and returns the removed element |
shift() | removes the first element of an array and returns the removed element |
sort() | sorts the elements alphabetically in strings and in ascending order |
slice() | selects the part of an array and returns the new array |
splice() | removes or replaces existing elements and/or adds new elements |
Методы Array
Метод | Описание |
---|---|
concat() | Метод для создания массива путем объединения нескольких массивов. Результат получается объединением массива, из которого вызывается метод с массивом или значениями, переданными аргументами методу. |
copyWithin() | Копирует элементы массива и вставляет их в тот же массив, заменяя определенные элементы массива (в зависимости от их индекса), длина массива при этом не изменяется. |
entries() | Возвращает объект итератор, который содержит пары ключ/значение по каждому индексу в массиве. |
every() | Возвращает , если каждый элемент в этом массиве удовлетворяет предоставленной функции тестирования. |
fill() | Заполняет все элементы массива одним значением, при необходимости задавая значение начального индекса с которого начинается заполнение и конечное значение индекса, которым заканчивается заполнение. |
filter() | Возвращает элементы массива, удовлетворяющие условию, указанному в функции обратного вызова. |
find() | Возвращает значение первого элемента в массиве, который соответствует условию в переданной функции, или , если ни один элемент не удовлетворяет условию в переданной функции. |
findIndex() | Возвращает индекс первого элемента в массиве, который соответствует условию в переданной функции. В противном случае возвращается -1. |
forEach() | Выполняет переданную функцию один раз для каждого элемента в массиве в порядке возрастания индекса. |
from() | Возвращает объект (массив) из любого объекта с свойством length или итерируемого объекта. |
includes() | Определяет, содержит ли массив определённый элемент, возвращая в зависимости от этого или . |
indexOf() | Возвращает первый индекс, по которому данный элемент может быть найден в массиве или -1, если такого индекса нет. |
isArray() | Проверяет, является ли переданный ему аргумент массивом. |
join() | Объединяет все элементы массива в строку и возвращает эту строку. По умолчанию разделителем является запятая (,), но метод позволяет задавать и другие разделители. |
keys() | Объединяет все элементы массива в строку и возвращает эту строку. По умолчанию разделителем является запятая (,), но метод позволяет задавать и другие разделители. |
lastIndexOf() | Возвращает последний индекс элемента внутри массива, эквивалентный указанному значению, или -1, если совпадений не найдено. |
map() | Создаёт новый массив с результатом вызова указанной функции для каждого элемента массива. |
pop() | Удаляет последний элемент из массива и возвращает этот элемент. |
push() | Добавляет один или несколько элементов в конец массива и возвращает новую длину массива. |
reduce() | Вызывает заданную функцию обратного вызова для всех элементов в массиве. Возвращаемое значение функции обратного вызова представляет собой накопленный результат и предоставляется как аргумент в следующем вызове функции обратного вызова. |
reduceRight() | Применяет заданную функцию обратного вызова к аккумулятору и каждому значению массива (справа-налево), сводя его к одному значению. |
reverse() | Изменяет порядок следования элементов в текущем массиве на обратный. |
shift() | Удаляет первый элемент из массива и возвращает этот элемент. |
slice() | Извлекает часть массива и возвращает новый массив. |
some() | Определяет, возвращает ли заданная функция обратного вызова значение для какого-либо элемента массива. |
sort() | Сортирует элементы массива. |
splice() | Изменяет текущий массив, добавляя или удаляя элементы. Возвращает массив с удаленными элементами, если элементы не удалялись, то возвращает пустой массив. |
toString() | Преобразует массив в строку и возвращает результат. |
unshift() | Добавляет один или несколько элементов в начало массива и возвращает новую длину массива. |
valueOf() | Возвращает примитивное значение объекта. |
Нарезка массива
Метод нарезает из куска массива в новый массив.
В этом примере вырезается часть массива, начиная с элемента массива 1 («Оранжевый»):
var fruits = ;
var citrus = fruits.slice(1);
Метод создает новый массив. Он не удаляет какие-либо элементы из исходного массива.
В этом примере вырезается часть массива, начиная с элемента массива 3 («Apple»):
var fruits = ;
var citrus = fruits.slice(3);
Метод может принимать два аргумента , как .
Затем метод выбирает элементы из начального аргумента и до конечного аргумента (но не включая его).
var fruits = ;
var citrus = fruits.slice(1, 3);
Если конечный аргумент опущен, как в первых примерах,
метод вырезает остальную часть массива.
reduce/reduceRight
Метод «arr.reduce(callback)» используется для последовательной обработки каждого элемента массива с сохранением промежуточного результата.
Это один из самых сложных методов для работы с массивами. Но его стоит освоить, потому что временами с его помощью можно в несколько строк решить задачу, которая иначе потребовала бы в разы больше места и времени.
Метод используется для вычисления на основе массива какого-либо единого значения, иначе говорят «для свёртки массива». Чуть далее мы разберём пример для вычисления суммы.
Он применяет функцию по очереди к каждому элементу массива слева направо, сохраняя при этом промежуточный результат.
Аргументы функции :
- – последний результат вызова функции, он же «промежуточный результат».
- – текущий элемент массива, элементы перебираются по очереди слева-направо.
- – номер текущего элемента.
- – обрабатываемый массив.
Кроме , методу можно передать «начальное значение» – аргумент . Если он есть, то на первом вызове значение будет равно , а если у нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.
Проще всего понять работу метода на примере.
Например, в качестве «свёртки» мы хотим получить сумму всех элементов массива.
Вот решение в одну строку:
Разберём, что в нём происходит.
При первом запуске – исходное значение, с которого начинаются вычисления, равно нулю (второй аргумент ).
Сначала анонимная функция вызывается с этим начальным значением и первым элементом массива, результат запоминается и передаётся в следующий вызов, уже со вторым аргументом массива, затем новое значение участвует в вычислениях с третьим аргументом и так далее.
Поток вычислений получается такой
В виде таблицы где каждая строка – вызов функции на очередном элементе массива:
результат | |||
---|---|---|---|
первый вызов | |||
второй вызов | |||
третий вызов | |||
четвёртый вызов | |||
пятый вызов |
Как видно, результат предыдущего вызова передаётся в первый аргумент следующего.
Кстати, полный набор аргументов функции для включает в себя , то есть номер текущего вызова и весь массив , но здесь в них нет нужды.
Посмотрим, что будет, если не указать в вызове :
Результат – точно такой же! Это потому, что при отсутствии в качестве первого значения берётся первый элемент массива, а перебор стартует со второго.
Таблица вычислений будет такая же, за вычетом первой строки.
Метод arr.reduceRight работает аналогично, но идёт по массиву справа-налево.
Методы перебирающие массив в ECMAScript 5
Подавляющее большинство браузеров поддерживают новые методы перебора массива, предоставляемые ECMAScript 5: forEach, map, и filter. Эти методы принимают функцию в качестве первого аргумента. Каждый элемент массива, в свою очередь, передается этой функции, которая принимает три аргумента: значение текущего элемента, его индекс и сам массив.
Функция, которую вы определяете, не должна использовать все три аргумента. В некоторых случаях вам понадобится использовать только значение элемента массива, что мы и покажем в наших примерах, демонстрирующих эти методы.
Метод forEach
Метод forEach перебирает элементы массива, как обычный JavaScript цикл for. Но вы не можете использовать оператор break для досрочного выхода, как в for. Метод forEach не возвращает значение.
В следующем примере мы объявляем массив и вызываем forEach. Передаем значение, индекс, и массив (v, i, a) в качестве аргумента функции, чтобы изменить массив, умножая каждое его значение на 2:
var ar = ; ar.forEach( function(v, i, ar) { ar = v*2; } ); console.log( ar ); //
В следующем примере мы создаем новый массив вместо того, чтобы преобразовать массив, вызванный forEach. Нам нужно только передать значение (v) для этого:
var ar = ; var ar2 = []; // новый массив // передаем значение, умножаем на 2, и выводим массив ar.forEach( function(v) { ar2.push(v*2); } ); // вид нового массива console.log( ar2 ); //
Значение элемента массива может быть использовано в JavaScript цикле по массиву forEach для любых целей. Но если вы хотите создать новый массив на основе значений существующего, то метод map подходит больше.
Метод map
Метод map создает новый массив. Каждый элемент из существующего массива передается аргументу функции map.
Возвращаемое значение функции определяет значение соответствующего элемента нового массива. В данном примере мы возвращаем значение (v),умноженное на 2:
var ar = ; var ar2 = ar.map( function(v) { return v*2; } ); console.log( ar2 ); //
Вот еще один пример использования метода map для преобразования первой буквы значения каждого элемента в верхний регистр:
var ar = ; var ar2 = ar.map( function(v) { return v.charAt(0).toUpperCase() + v.slice(1); } ); console.log( ar2 ); //
Часто нужно проверять тип значения элемента массива, прежде чем воздействовать на него. Например, если массив содержит значения, которые не являются строками в JavaScript, будет выводиться сообщение об ошибке «TypeError».
Поэтому мы включаем проверку типа:
var ar = ; var ar2 = ar.map( function(v) { if ( typeof v === 'string' ) { return v.charAt(0).toUpperCase() + v.slice(1); } } ); console.log( ar2 ); //
Обратите внимание, что для значений, не являющихся строками, было возвращено undefined. Это происходит потому, что массив, возвращенный методом map, соответствует длине JavaScript созданного массива в цикле, для которого он вызывался
Это происходит даже в разреженных массивах.
Пересмотрим нашу функцию, чтобы вернуть исходное значение, когда тип не является строкой:
var ar = ; var ar2 = ar.map( function(v) { if ( typeof v === 'string' ) { return v.charAt(0).toUpperCase() + v.slice(1); } else { return v; } } ); console.log( ar2 ); //
Что делать, если мы хотим, чтобы наш массив состоял только из элементов определенного типа? Для этого можем использовать метод filter.
Метод filter
Метод filter возвращает JavaScript созданный массив в цикле. Он выбирает из исходного массива и возвращает новый, состоящий из элементов, соответствующих заданным критериям. Мы можем использовать метод filter следующим образом, чтобы возвратить массив, содержащий только строковые значения:
var ar = ; var ar2 = ar.filter( function(v) { if ( typeof v === 'string' ) { return true; } } ); console.log( ar2 ); //
Метод filter проверяет каждый элемент массива, и его аргумент функции должен возвратить true или false, чтобы указать, следует ли включать текущий элемент из JavaScript цикла по массиву в возвращаемый массив или нет.
В этом примере используется оператор остатка от деления (%), с помощью которого формируется новый массив, содержащий только четные значения из исходного массива:
var ar = ; var ar2 = ar.filter( function(v) { return v % 2 === 0; } ); console.log( ar2 ); //
Метод filter пропускает отсутствующие элементы в разреженных массивах. Таким образом, он может быть использован для создания обычного массива из разреженного:
var ar = ; // разреженный массив // использование filter, чтобы вернуть плотную версию разреженного массива var ar2 = ar.filter( function() { return true; } ); console.log( ar2 ); //
JS Учебник
JS ГлавнаяJS ВведениеJS Что? Где? Куда?JS ВыводJS ЗаявленияJS СинтаксисJS КомментарииJS ПеременныеJS ОператорыJS АрифметикаJS ПрисваиванияJS Типы данныхJS ФункцииJS ОбъектыJS СобытияJS СтрокиJS Методы строкJS ЧислаJS Методы чиселJS МассивыJS Методы массиваJS Сортировка массиваJS Итерация массиваJS Объекты датJS Формат датJS Метод получения датJS Метод набора датJS Математические…JS Случайные числаJS БулевыJS Сравнение…JS Заявления if…elseJS Заявление switchJS Цикл forJS Цикл whileJS Заявление break…JS Преобразование…JS Битовые…JS Регулярные выраженияJS ОшибкиJS ОбластьJS ПодъемныйJS СтрогийJS Ключевое слово thisJS Ключевое слово letJS КонстантыJS Функция стрелкиJS КлассыJS ОтладчикJS Руководство стиляJS ПрактикаJS Распространенные ошибкиJS ЭффективностьJS Зарезервированные словаJS ВерсииJS Версия ES5JS Версия ES6JS Версия 2016JS Версия 2017JS JSON
Удаление элемента по индексу в JavaScript
splice()
Функция splice() удалит элементы с определённого индекса. Вот как выглядит удаление элементов с 3-го индекса:
var users = "Tom", "Bob", "Bill", "Alice", "Kate"]; var deleted = users.splice(3); console.log(deleted); // console.log(users); //
А возвратит удалённые элементы метод slice.
Как видите, удаление идёт с начала массива. Но если передадим отрицательный индекс, удаление начнётся с конца массива. Давайте удалим лишь последний элемент:
var users = "Tom", "Bob", "Bill", "Alice", "Kate"]; var deleted = users.splice(-1); console.log(deleted); // console.log(users); //
Кстати, можно задать конечный индекс для удаления. Удалим элементы, начиная с первого, заканчивая третьим индексами:
var users = "Tom", "Bob", "Bill", "Alice", "Kate"]; var deleted = users.splice(1,3); console.log(deleted); // console.log(users); //
Можно вставить новые элементы вместо удаляемых:
var users = "Tom", "Bob", "Bill", "Alice", "Kate"]; var deleted = users.splice(1,3, "Ann", "Roy"); console.log(deleted); // console.log(users); //
Обратите внимание, что мы удалили 3 элемента (с первого по третий индексы), а вместо них вставили только два элемента
concat()
Метод или функция concat() нужна, чтобы объединять массивы:
var fruit = "груши", "яблоки", "сливы"]; var vegetables = "огурцы", "помидоры", "картошка"]; var products = fruit.concat(vegetables); for(var i=; i < products.length; i++) document.write(productsi + "<br/>");
И совсем необязательно объединять лишь однотипные массивы, можно и разнотипные:
var fruit = "груши", "яблоки", "сливы"]; var prices = 20, 30, 70]; var products = fruit.concat(prices);
join()
Функцией join() можем объединить в одну строку все элементы массива:
var fruit = "груши", "яблоки", "сливы", "абрикосы", "апельсины"]; var fruitString = fruit.join(", "); document.write(fruitString);
В функцию join() передаётся разделитель между элементами массива. В нашем случае в качестве разделителя используется запятая и пробел («, «).
sort()
Функция sort() позволяет сортировать массив по возрастанию:
var fruit = "груши", "яблоки", "сливы", "абрикосы", "пони"]; fruit.sort(); for(var i=; i < fruit.length; i++) document.write(fruiti + "<br/>");
В результате элементы будут отсортированы по алфавиту:
абрикосы груши пони сливы яблоки
reverse()
С помощью reverse() мы перевернём массив задом наперед:
var fruit = "груши", "яблоки", "сливы", "абрикосы", "апельсины"]; fruit.reverse(); for(var i=; i < fruit.length; i++) document.write(fruiti + "<br/>");
Итог:
апельсины абрикосы сливы яблоки груши
Итого
Объекты, которые можно использовать в цикле , называются итерируемыми.
- Технически итерируемые объекты должны иметь метод .
- Результат вызова называется итератором. Он управляет процессом итерации.
- Итератор должен иметь метод , который возвращает объект , где сигнализирует об окончании процесса итерации, в противном случае – следующее значение.
- Метод автоматически вызывается циклом , но можно вызвать его и напрямую.
- Встроенные итерируемые объекты, такие как строки или массивы, также реализуют метод .
- Строковый итератор знает про суррогатные пары.
Объекты, имеющие индексированные свойства и , называются псевдомассивами. Они также могут иметь другие свойства и методы, но у них нет встроенных методов массивов.
Если мы заглянем в спецификацию, мы увидим, что большинство встроенных методов рассчитывают на то, что они будут работать с итерируемыми объектами или псевдомассивами вместо «настоящих» массивов, потому что эти объекты более абстрактны.
создаёт настоящий из итерируемого объекта или псевдомассива , и затем мы можем применять к нему методы массивов. Необязательные аргументы и позволяют применять функцию с задаваемым контекстом к каждому элементу.