Сегодня расскажу вам как умные мужи, который принимают стандарты ECMAScript осознали свою ошибку и отсыпали нам немного новых методов взамен бракованных, а так же просто о новинках, которые касаются массивов в JavaScript.
Думаю, что, в повседневной жизни, одним из самых часто используемых методов массива для меня является метод Array.map. Думаю, что многие использовали его ни раз. Очень легко привыкнуть к тому, что он возвращает новый массив. Думаю, что это корень причины почему я и многие другие люди, с которыми я общался, часто забывают о том, что метод Array.sort работает совсем не так. Этот метод мутирует (изменяет) исходный массив, и если вам нужен исходный массив в неизменном виде (или вы просто угорели по ФП и чистым функциям), то вам придется сначала сделать его копию.
Но этот день настал. Появился новы, не мутирующий, метод Array.toSorted. С неймингом, конечно, беда, но ничего не поделать. В мире уже миллиарды строчек кода с Array.sort, которые работают так, как работают.
// 🤬
const source = [ 5, 3, 7, -3, 0, -8 ]
const result = array.sort((a, b) => a - b)
console.log(result) // [ -8, -3, 0, 3, 5, 7 ]
console.log(source) // [ -8, -3, 0, 3, 5, 7 ]
// 😍
const source = [ 5, 3, 7, -3, 0, -8 ]
const result = array.toSorted((a, b) => a - b)
console.log(result) // [ -8, -3, 0, 3, 5, 7 ]
console.log(source) // [ 5, 3, 7, -3, 0, -8 ]
Но сортировкой дело не ограничилось. Под раздачу попали и другие методы, которые вели себя “неочевидно”.
Во-первых, это метод Array.toReversed (альтернатива Array.reverse), который создает "перевернутую" копию исходного массива не изменяя исходного. Так же свою "неинвазивную" версия получил и универсальный метод изменения массива Array.splice - Array.toSpliced.
Напоследок, стоит сказать о новом методе Array.with, который, как сказано в документации, является не мутирующим аналогом изменения массива через квадратные скобки. Для понятности, приведу пример.
const array = [ 1, 2, 3 ];
// Изменяем значение в массиве по индексу 1
array[1] = 4;
console.log(array); // [ 1, 4, 3 ]
// Изменяем значение в массиве по индексу 1, но результат получаем в новом массиве
const newArray = array.with(1, 6);
console.log(array); // Все еще [ 1, 4, 3 ]
console.log(newArray); // [ 1, 6, 3 ]
Помимо перечисленных выше новых версий методов, альтернативы появились и у методов поиска в массиве Array.find и Array.findIndex - Array.findLast и Array.findLastIndex.
Как очевидно из названия, по аналогии со старыми методами, Array.findLast возвращает последний элемент, который удовлетворяет условию. Array.findLastIndex же возвращает не сам элемент, а его индекс (что более полезно, как мне кажется).
Напоследок, хочу рассказать о методе Array.at. Его, в отличии от всех методов выше, я уже несколько месяцев использую в своем проекте, так что он не совсем новичок, хотя и знают про него, как выяснилось, не все мои коллеги.
В сущности, это метод, который позволяет получить элемент из массива по индексу, примерно как через квадратные скобки. Вся же его прелесть раскрывается в тех ситуациях, когда необходимо извлечь, например, последний или n с конца элемент.
const arrray = [ 1, 2, 3 ];
// Обычно, для того, чтобы извлечь последний элемент мы используем его длину.
console.log(array[array.length - 1]); // 🤬
console.log(array.at(-1); // 😍
Согласитесь, там намного удобнее и читабельней.