Урок 03

Массивы: методы

Полный обзор методов массивов по категориям.

Мутирующие

Меняют исходный массив:

arr.push(...)    // добавить в конец
arr.pop()        // удалить с конца
arr.unshift(...) // добавить в начало
arr.shift()      // удалить с начала
arr.splice()     // вставить/удалить/заменить
arr.reverse()    // развернуть
arr.sort()       // отсортировать
arr.fill()       // заполнить
arr.copyWithin() // копировать внутри

Не мутирующие

Возвращают новый массив:

arr.slice()      // копия части
arr.concat()     // объединить
arr.map()        // преобразовать
arr.filter()     // оставить
arr.flat()       // развернуть вложенные
arr.flatMap()    // map + flat
arr.toSorted()   // ES2023
arr.toReversed() // ES2023
arr.toSpliced()  // ES2023
arr.with()       // ES2023

Поиск

arr.indexOf(x)      // индекс или -1
arr.lastIndexOf(x)  // с конца
arr.includes(x)     // true/false
arr.find(fn)        // первый подходящий
arr.findIndex(fn)   // индекс
arr.findLast(fn)    // последний
arr.findLastIndex(fn)

Проверки

arr.some(fn)   // хотя бы один
arr.every(fn)  // все
Array.isArray(arr)

Преобразование

arr.join(',')  // в строку
arr.toString()
arr.keys()     // итератор индексов
arr.values()   // итератор значений
arr.entries()  // итератор пар

Свёртка

arr.reduce((acc, x) => acc + x, 0)
arr.reduceRight(...)

Сортировка

По умолчанию — лексикографически:

[10, 2, 1].sort(); // [1, 10, 2]

Числовая:

[10, 2, 1].sort((a, b) => a - b); // [1, 2, 10]

Строковая:

['б', 'а', 'в'].sort((a, b) => a.localeCompare(b));

Объекты:

users.sort((a, b) => a.age - b.age);

Стабильность сортировки: равные элементы сохраняют порядок.

flat и flatMap

[1, [2, [3, [4]]]].flat();    // [1, 2, [3, [4]]]
[1, [2, [3, [4]]]].flat(2);   // [1, 2, 3, [4]]
[1, [2, [3, [4]]]].flat(Infinity); // [1, 2, 3, 4]

[1, 2].flatMap((x) => [x, x * 2]); // [1, 2, 2, 4]

at

[1, 2, 3].at(0);  // 1
[1, 2, 3].at(-1); // 3

Лучше, чем arr[arr.length - 1].

ES2023: иммутабельные

const arr = [3, 1, 2];

arr.toSorted();              // [1, 2, 3], arr не меняется
arr.toReversed();            // [2, 1, 3]
arr.toSpliced(1, 1);         // [3, 2]
arr.with(0, 99);             // [99, 1, 2]

Не мутируют. Идеально для функционального стиля.

fill

new Array(3).fill(0); // [0, 0, 0]
[1, 2, 3].fill(0, 1); // [1, 0, 0]

copyWithin

[1, 2, 3, 4, 5].copyWithin(0, 3); // [4, 5, 3, 4, 5]

Редко используется.

from и of

Array.from('abc');
Array.from({ length: 5 }, (_, i) => i); // [0, 1, 2, 3, 4]
Array.from(new Set([1, 2, 2, 3]));      // [1, 2, 3]

Array.of(1, 2, 3); // [1, 2, 3]
Array.of(7);       // [7]
new Array(7);      // [empty × 7]

Проверка и создание

Array.isArray([]);           // true
Array.from({ length: 3 });   // [undefined, undefined, undefined]

Итоги

  • Мутирующие: push, pop, splice, sort
  • Не мутирующие: map, filter, slice, toSorted
  • Поиск: find, indexOf, includes
  • Преобразование: flat, flatMap, join
  • ES2023: toSorted, toReversed, with
  • at для доступа с конца