Вот 6 способов использования оператора Spread с массивом в JavaScript. Вы можете использовать его для объединения или клонирования массива. Или используйте его для преобразования итераций в массив.
// Merge Array [...array1, ...array2]
// Clone Array [...array]
// Sting → Array [...'string']
// Set → Array [...new Set([1,2,3])]
// Node List → Array [...nodeList]
// Arguments → Array [...arguments]
Понимание распространения
MDN: синтаксис Spread позволяет развернуть итерацию, например выражение массива или строку, в местах, где ожидается ноль или более аргументов (для вызовов функций) или элементов (для литералов массива), или выражение объекта, которое должно быть развернуто в места, где ожидается ноль или более пар "ключ-значение" (для объектных литералов).
Ясно, как грязь прямо 😂 Разбирался долго. Итак, позвольте мне попытаться объяснить с помощью двух аналогий, которые мне помогли. Надеюсь, это тоже может вам помочь 🤞
Распространение похоже на русских кукол
Синтаксис распространения берет ваш массив и расширяет его на элементы. Представьте, что ваш массив похож на этих русских кукол. Когда вы вызываете для него синтаксис распространения, он извлекает вложенную отдельную куклу и раскладывает ее по отдельным частям.
Источник: Википедия
Распространение похоже на ластик
Если аналогия с Русскими куклами не помогла, а Spread все еще неясен для вас 😵 В этом случае просто подумайте о синтаксисе ...
как о ластике, удаляющем скобки в массиве 😂
[ ...[1, 2, 3] // 👈 The dots erases the brackets ]
/* Becoming this: */ [ 1, 2, 3 // 👈 "Erased" ]
Манипуляции с массивами
Лучшее в синтаксисе Spread - это использовать его для управления массивами 👏
1. Используйте Spread для слияния массива
Допустим, у нас есть 2 массива.
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
Давайте посмотрим, что произойдет, когда мы попытаемся объединить массив без синтаксиса распространения.
const attemptToMerge = [array1, array];
attemptToMerge; // [ [1, 2, 3], [4, 5, 6] ] 👈 😱
👆 Когда вы пытаетесь объединить массив без синтаксиса распространения, вы получаете вложенный или многомерный массив.
Итак, давайте воспользуемся синтаксисом Spread, чтобы «стереть» скобки.
const mergedArray = [ ...array1, ...array2 ];
mergedArray; // [ 1, 2, 3, 4, 5, 6 ]
2. Клонировать массив
Клонирование массива в JavaScript не так просто. Итак, давайте посмотрим, как это делается двумя способами - неправильным и правильным 🛣
Неправильное клонирование массива
В JavaScript массивы являются ссылочными типами, поэтому вы не можете просто создать новую копию массива, используя =
. Посмотрим, какая проблема случится, если мы попробуем сделать это таким образом.
const original = ['zero', 'one']; const newArray = original;
original; // ['zero', 'one'] newArray; // ['zero', 'one']
👆Так что пока все выглядит нормально, но давайте посмотрим, что произойдет, если мы изменим элемент.
newArray[1] = '💩';
newArray; // ['zero', '💩']
original; // ['zero', '💩'] 👈 😱 Our original array is affected
Ой, да Изменение newArray
изменит исходный массив 👎
Думайте о ссылках как о адресах. Когда мы создаем копию массива с помощью =
, мы копируем только адрес. Мы НЕ скопировали базовый массив, а это то, что мы хотим. Для этого нам нужно скопировать массив по новому адресу. Таким образом, когда мы вносим изменения в наш новый массив, это не повлияет на исходный массив, потому что они находятся по разным адресам.
Правильное клонирование массива
const original = ['zero', 'one']; const newArray = [...original];
original; // ['zero', 'one'] newArray; // ['zero', 'one']
Так что, если мы сделали это правильно, наш original
массив не пострадает, если мы изменим newArray
. Хорошо, давай попробуем
newArray[1] = '💩';
newArray; // ['zero', '💩']
original; // ['zero', 'one'] ✅ original array is NOT affected
Итерируемые объекты в массив
Благодаря Spread преобразование различных типов данных в массив никогда не было таким простым 👏
3. Строка в массив
Когда мы распространяем string
, он вернет массив отдельных подстрок.
const string = 'hi';
const array = [...string];
array; // [ 'h' , 'i' ]
4. Установите в массив
Давайте создадим новый set
объект:
const set = new Set([1, 2, 3]);
set; // Set(3) {1, 2, 3}
Используя Spread, мы можем преобразовать set
в массив:
const array = [...set];
array; // [1, 2, 3]
5. Список узлов в массив
Давайте создадим список узлов:
const nodeList = document.querySelectorAll('p');
nodeList; // [p, p, p]
Теперь мы можем использовать Spread для преобразования нашего списка узлов в массив:
const array = [...nodeList];
array;
6. Аргументы массива
Прежде чем мы начнем, давайте разберемся, что такое arguments
объекты.
MDN: arguments - это объект типа Array, доступный внутри функций, который содержит значения аргументов, переданных этой функции.
👆 Обратите внимание на ключ, array-like
. Итак, это похоже на массив, но это не так 😅 Таким образом, преимущество преобразования объекта arguments в массив означает, что у нас есть доступ ко всем замечательным методам массива (например, map
, filter
, find
) 👍
function names() { arguments; // Arguments(4)['samantha', 'sam']
arguments.map(name => `hi ${name}`); // ❌ TypeError: arguments.map is not a function }
names('samantha', 'sam');
Хорошо, давайте преобразуем наши аргументы в массив, чтобы мы могли применить к нему методы массива 🙌
function names() { const argumentsArray = [...arguments];
argumentsArray.map(name => `hi ${name}`); // ✅ ['hi samantha', 'hi sam'] }
names('samantha', 'sam');
Вклад сообщества
- @harmleprinze: Разделение предоставит больше возможностей, учитывая, что он принимает разделитель и ограничение
- @ mohammed_mamoun_98: Если вы объедините два массива без распространения, это будет двумерный массив, но плоский, сделайте его одномерным, так что я думаю, это будет более эффективно. Можешь попробовать
Ресурсы
- Фишка кода: разделение строки с помощью ES6 Spread
- Веб-документы MDN: синтаксис распространения
- Веб-документы MDN: Установить
- MDN Web Docs: объект arguments
- Чтобы найти больше лакомых кусочков кода, посетите samanthaming.com
Спасибо за чтение ❤
Чтобы найти больше интересных моментов, посетите samanthaming.com
🎨 Instagram | 🌟 Twitter | 👩🏻💻 SamanthaMing.com