Мы используем массивы каждый день, но знаете ли вы, насколько глубока кроличья нора?
Массивы - это списки объектов, которыми можно управлять различными способами. К каждой записи можно получить доступ по их собственному индексу. Массивы можно комбинировать различными способами, а также их можно вкладывать друг в друга, что позволяет нам создавать многомерные массивы. Мы можем делать массивы из коллекции любых объектов. Их также можно преобразовать в переменные, чтобы можно было получить доступ к каждой записи и управлять ею индивидуально. Массивы JavaScript имеют нулевой индекс, поэтому начальный индекс каждого массива всегда равен нулю. Это означает, что индекс 0 имеет первый элемент массива.
Массивы могут содержать любой тип объекта. Они не обязательно должны быть объектами одного типа. Также, если элемент массива с данным индексом еще не назначен, он имеет значение undefined
.
Примеры вещей, которые можно хранить с массивами, включают:
- список дел
- список рецептов
- адресная книга контакты
- список покупок
- продуктовый список
- ваши встречи
- все остальное, что можно внести в список.
Без массивов все, что мы можем сделать, это объявить переменные для каждой записи индивидуально, что является настоящей болью и непрактично.
Объявление массивов
Для объявления массивов мы используем ключевое слово let
или const
- вот так:
let arr = [1,2,3]; const arr2 = [1,2,3];
Мы используем let
для переменных и const
для массивов, которые не меняются.
Кроме того, мы можем сначала объявить массивы, а затем вставить значения, например:
let arr = [] arr[0] = 1; arr[1] = 2; arr[2] = 3;
Это то же самое, что и let arr = [1,2,3]
, поскольку у нас одинаковые записи и одинаковый порядок в обоих arr
массивах.
Мы можем объявлять массивы с разными типами значений в одном массиве, например:
let arr = [1, 'chicken', {foo: 'bar'}];
Как видите, не имеет значения, какие данные мы помещаем в массив. Однако мы должны быть осторожны, чтобы избежать ошибок типа данных, когда мы просматриваем или манипулируем массивами, проверяя тип и содержимое объектов, а также является ли какая-либо запись null
или undefined
.
Другой способ создать массив - это ключевое слово new
, например:
let names = new Array('Bob','Jane', 'John');
Доступ к данным массива
Мы получаем доступ к элементам массива по их индексу. Например, чтобы получить второй элемент массива, мы пишем:
arr[1]
Если arr
назначен [1, ‘chicken’, {foo: ‘bar’}];
, тогда arr[1]
будет 'chicken'
.
Получить размер массива
Массив - это объект, у которого есть свойство length
, которое позволяет нам получить размер массива, поэтому массив names
, который мы имеем выше, будет иметь length
из трех. Мы пишем names.length
для доступа к длине массива.
Многомерные массивы
В JavaScript многомерные массивы - это просто массив, вложенный в другой массив. Итак, чтобы объявить многомерный массив, мы можем использовать те же методы объявления, что и выше, за исключением того, что мы заменяем сущности внутри массивами. Например, мы можем написать:
let multiArray = [[1,2,3], [4,5,6]];
or:
let multiArray = new Array([1,2,3], [4,5,6]);
Мы также можем написать:
let multiArray = []; multiArray[0] = []; multiArray[0][0] = 1; multiArray[0][1] = 2; multiArray[0][2] = 3; multiArray[1] = []; multiArray[1][0] = 4; multiArray[1][1] = 5; multiArray[1][2] = 6;
Все три части кода эквивалентны.
Мы получаем доступ к элементам многомерного массива, добавляя еще одну квадратную скобку с индексом внутреннего массива. Например, если мы хотим получить второй элемент первого массива в multiArray
, мы напишем:
multiArray[0][1]
Обход массивов
Мы можем перемещаться по значениям массивов с помощью циклов. Циклы - это фрагменты кода, которые повторяются до тех пор, пока не будет выполнено конечное условие. В JavaScript у нас есть цикл for
, цикл while
и цикл do...while
.
Для петли
С помощью цикла for
, учитывая, что у нас есть массив name
, мы можем пройти цикл, выполнив:
let names = new Array('Bob','Jane', 'John'); for (let i = 0; i < names.length; i++){ console.log(names[i]); }
Цикл for
обычно записывается с начальным условием в качестве первого оператора, затем с конечным условием во втором операторе и условием изменения индекса в третьем операторе. Операторы разделяются точкой с запятой. Поскольку в JavaScript массивы начинаются с нулевого индекса, мы завершаем цикл, когда индекс массива становится на единицу меньше длины массива.
Пока цикл
while
цикл будет повторяться всякий раз, когда условие остается истинным.
Например, приведенный ниже цикл будет выполняться, если номер индекса i
меньше трех:
const array = [1,2,3];let i = 0; while(i < array.length){ console.log(i); }
Если условие в круглых скобках никогда не выполняется, содержимое цикла никогда не будет выполняться.
Сделать цикл
do...while
цикл всегда будет выполнять первую итерацию.
const array = [1,2,3];let i = 0; do{ console.log(i); } while(i < array.length)
В приведенном выше примере он будет регистрировать как минимум 0, но в этом случае он также будет регистрировать 1 и 2, поскольку эти два числа меньше трех.
С помощью вышеуказанных циклов вы можете вызвать break
, чтобы остановить цикл, или return
, прежде чем цикл будет полностью завершен.
//do while loop const array = [1,2,3];let i = 0;do{ console.log(i); if (i == 1}{ break; }} while(i < array.length)//while loop i = 0;while(i < array.length){ if (i == 1{ break; } console.log(i); }//for loop for (let j = 0; j < array.length; j++){ if (j == 1){ break; } console.log(j); }
В приведенных выше примерах вы не увидите двух зарегистрированных.
Пример возврата из цикла:
const loop = ()=>{ const array = [1,2,3]; for (let j = 0; j < array.length; j++){ if (j == 1){ return j; } console.log(j); } } loop() //returns 1
Вы также можете пропустить итерации с помощью оператора continue
:
const array = [1,2,3]; for (let j = 0; j < array.length; j++){ if (j == 1){ continue; } console.log(j) // 1 will be skipped; }
Свойства массива
Поскольку массив - это объект JavaScript. Это его собственные свойства. Как и любой объект в JavaScript, он имеет свойство prototype
, которое позволяет разработчикам добавлять методы и свойства объекта массива. Свойство constructor
- это ссылка на функцию, созданную прототипом объекта массива. length
возвращает размер массива.
Методы массива
Чтобы упростить управление массивами, стандартная библиотека JavaScript содержит множество методов массива, которые упрощают управление массивами. Существуют методы поиска и фильтрации элементов, а также, например, добавления и удаления элементов в массиве. Также есть функции для объединения нескольких массивов в один.
Это некоторые общие методы работы с массивами, которые можно использовать для выполнения общих операций с массивами.
Array.forEach
forEach
будет перебирать каждую запись массива. Вы не можете вырваться из него или вернуть из него значение. Требуется функция обратного вызова, в которой вы можете выполнить код.
Пример:
const array = [1,2,3]; array.forEach(a =>{ console.log(a); })
В приведенном выше примере будут зарегистрированы все числа в массиве.
Array.find
Array.find
вернет элемент в массиве с заданным условием. Например, если вы хотите получить определенные числа из массива, вы делаете это:
const array = [1,2,3]; const num = array.find(a => a == 2); // returns 2
find
возвращает единственный результат.
Array.findIndex
Array.findIndex
вернет индекс элемента в массиве с заданным условием. Требуется функция обратного вызова, которая возвращает заданное условие. Например, если вы хотите получить индекс определенного числа из массива, вы делаете это:
const array = [1,2,3]; const num = array.findIndex(a => a == 2); // returns 1
Array.filter
Array.filter
вернет массив элементов, соответствующих заданному условию. Требуется функция обратного вызова, которая возвращает заданное условие. filter
возвращает новый массив.
Например, если вы хотите получить индекс определенного числа из массива, вы делаете:
const array = [1,2,3]; const numArray = array.filter(a => a == 2); // returns [2]
Array.includes
Array.includes
проверяет, существует ли элемент в массиве. Требуется число или строка, которые функция может сравнивать.
const array = [1,2,3]; const includesTwo = array.includes(2); // returns true
Array.some
Array.some
проверяет, соответствуют ли некоторые элементы заданному условию. Требуется функция обратного вызова, которая возвращает логическое значение для условия.
const array = [1,2,3]; const includesTwo = array.some(a => a == 2); // returns true const includesFive = array.some(a => a == 5); // returns false
Array.every
Array.every
проверяет, соответствует ли каждый элемент заданному условию. Требуется функция обратного вызова, которая возвращает логическое значение для условия.
const array = [1,2,3]; const everyElementIsTwo = array.every(a => a == 2); // returns false const everyElementIsNumber = array.every(a => typeof a == 'number'); // returns true since every item in the array is a number
Array.isArray
Array.isArray
проверяет, является ли данный объект массивом. Это удобный способ проверить, является ли элемент массивом.
const array = [1,2,3];const notArray = {}; let objIsArray = Array.isArray(array); // true objIsArray = Array.isArray(notArray); // false
Array.from (новый набор (массив))
Set
- это объект, в котором не может быть повторяющихся записей. Вы можете создать новый Set
из массива, а затем преобразовать его обратно в массив.
const array = [1,2,2,3]; const arrayWithDups = Array.from(new Set(array)); //returns new array without duplicates, [1,2,3]
Array.slice (startIndex, endIndex)
Возвращает новый массив от startIndex
до endIndex — 1
.
Пример:
const arr = [1,2,3,4,5]; const newArr = arr.slice(0,2); console.log(newArr); // returns [1,2]
Array.splice (индекс, numberOfItems)
Удалите элемент массива на месте с заданным index
, а затем numberOfItems
после него.
Например:
const arr = [1,2,3,4,5]; arr.splice(0,2); console.log(arr); // returns [3, 4, 5] since we specified that we remove item located at index 0 and 2 items after that.
Array.sort (функция сортировки)
Array.sort
сортирует массив на месте в соответствии с условием, которое вы возвращаете insortFunction
.
sortFunction
должен быть в таком формате:
const sortFunction = (a, b) { if (a < b) { return -1; } if (a > b) { return 1; } // a must be equal to b return 0; }
По умолчанию, если sortFunction
не указан, элементы массива будут преобразованы в строку и будут отсортированы в соответствии со значением Unicode строки.
Array.fill (newElement, startIndex, endIndex)
Array.fill
добавит или заменит элемент на элемент, указанный от startIndex
до endIndex
. Если startIndex
не определен, он будет начинаться с 0. Если endIndex
не определен, он изменит значения до конца массива.
Например:
let array = [1, 2, 3, 4, 5];console.log(array.fill(0, 2, 4)); // array is now [1, 2, 0, 0, 0]console.log(array.fill(5, 1)); // array is now [1, 5, 5, 5, 5]console.log(array.fill(6)); // array is now [6, 6, 6, 6, 6]
Рекурсивно сгладить массив
Array.flat
не справляется с рекурсивно сглаженными массивами. Глубина ограничена, и она не сглаживает все виды вложенных структур массивов. Лучший способ сделать это - написать для этого рекурсивную функцию.
let arr1 = [1, 2, [3, 4], 5]; let arr2 = [1, 2, [3, 4], [5, [6,[7,]]]];const flatten = (items) => { const flat = []; items.forEach(item => { if (Array.isArray(item)) { flat.push(...flatten(item)); } else { flat.push(item); } }); return flat; }console.log(flatten(arr1)); console.log(flatten(arr2));
Array.join (разделитель)
Array.join
вернет строку путем объединения записей после их преобразования в строку с separator
между каждой записью. Лучше всего работает со строковыми и числовыми массивами.
Пример:
const arr = [1,2,3]; console.log(arr.join(',')) // get '1,2,3'const arr = ['1',2,3]; console.log(arr.join(',')) // get '1,2,3'
Array.indexOf (elementToFind)
Array.indexOf
вернет первый индекс elementToFind
в массиве. Лучше всего работает со строковыми и числовыми массивами. Если вы хотите найти объект, не являющийся строкой или числом, используйте Array.findIndex
. Возвращает -1, если элемент не найден.
Пример:
const arr = [1,2,3]; console.log(arr.indexOf(1)); // returns 0const arr2 = [1,1,2,3]; console.log(arr2.indexOf(1)) // still 0
Array.lastIndexOf ()
Array.lastIndexOf
вернет последний индекс elementToFind
в массиве. Лучше всего работает со строковыми и числовыми массивами. Возвращает -1, если элемент не найден. Функция также принимает начальный индекс, чтобы начать поиск в обратном направлении в качестве второго параметра.
Пример:
const arr = [1,2,3]; console.log(arr.indexOf(1)); // returns 0const arr2 = [1,1,2,3]; console.log(arr2.indexOf(1)) // returns 1const arr3 = [3,1,2,3] console.log(arr3.lastIndexOf(3, 2)) // returns 0, start searching backwards from index 2
Array.push (новыйЭлемент)
Array.push
добавляет новый элемент в массив.
Пример:
let arr = [1,2,3]; arr.push(4); console.log(arr) // [1,2,3,4]
Array.pop ()
Array.pop
удаляет последний элемент массива.
Пример:
let arr = [1,2,3,4]; arr.pop(); console.log(arr) // [1,2,3]
Array.map (mapFunction)
Array.map
возвращает новый массив, который преобразует элемент существующего массива, вызывая mapFunction
. mapFunction
принимает один аргумент - элемент массива.
Пример:
let arr = [1,2,3,4]; const newArr = arr.map(a=>a*2) console.log(newArr) // [2,4,6,8]
Array.reduce (уменьшитьФункция)
Array.reduce
объединяет элементы массива, чтобы вернуть значение, вызывая reduceFunction
для всех элементов, чтобы объединить их. reduceFunction
принимает два аргумента: текущий и следующий элемент в массиве.
Пример:
const arr = [1,2,3,4]; const sum = arr.reduce((a,b)=>a+b); console.log(sum); // returns 10
Array.reverse ()
Array.reverse
возвращает новый массив с элементами существующего массива в обратном порядке.
Пример:
const arr = [1,2,3,4]; console.log(arr.reverse()) // [4,3,2,1]
Теперь, когда мы узнали о массивах, мы можем делать гораздо больше в наших программах на JavaScript. Впереди нас ждет большой мир!