JavaScript много способов сделать что-нибудь. Я написал 10 способов написать трубу/составить в JavaScript, и теперь мы делаем массивы.
1. Распространение оператора (неглубокая копия)
С тех пор, как ES6 упал, это был самый популярный метод. Это краткий синтаксис, и вы обнаружите, что это невероятно полезно при использовании библиотек, таких как React и Redux.
numbers = [1, 2, 3]; numbersCopy = [...numbers];
Примечание: Это не благополучно копирует многомерные массивы. Значения массива/объектов копируются Ссылка вместо ценить .
Это хорошо
numbersCopy.push(4); console.log(numbers, numbersCopy); // [1, 2, 3] and [1, 2, 3, 4] // numbers is left alone
Это не в порядке
nestedNumbers = [[1], [2]]; numbersCopy = [...nestedNumbers]; numbersCopy[0].push(300); console.log(nestedNumbers, numbersCopy); // [[1, 300], [2]] // [[1, 300], [2]] // They've both been changed because they share references
2. Старый добрый для () петля (неглубокая копия)
Я представляю, что этот подход – это минимум Популярные, учитывая, как модное функциональное программирование стало в наших кругах.
Чистый или нечистый, декларативный или императивный, он проводится работа!
numbers = [1, 2, 3];
numbersCopy = [];
for (i = 0; i < numbers.length; i++) {
numbersCopy[i] = numbers[i];
}
Примечание: Это не благополучно копирует многомерные массивы. Так как вы используете = Оператор, оно назначает объекты/массивы по Ссылка вместо ценить .
Это хорошо
numbersCopy.push(4); console.log(numbers, numbersCopy); // [1, 2, 3] and [1, 2, 3, 4] // numbers is left alone
Это не в порядке
nestedNumbers = [[1], [2]];
numbersCopy = [];
for (i = 0; i < nestedNumbers.length; i++) {
numbersCopy[i] = nestedNumbers[i];
}
numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1, 300], [2]]
// [[1, 300], [2]]
// They've both been changed because they share references
3. Старый добрый () Петля (неглубокая копия)
Так же, как для Имп, императив, бла, бла, бла … это работает! ?
numbers = [1, 2, 3];
numbersCopy = [];
i = -1;
while (++i < numbers.length) {
numbersCopy[i] = numbers[i];
}
Примечание: Это также назначает объекты/массивы по Ссылка вместо ценность Отказ
Это хорошо
numbersCopy.push(4); console.log(numbers, numbersCopy); // [1, 2, 3] and [1, 2, 3, 4] // numbers is left alone
Это не в порядке
nestedNumbers = [[1], [2]];
numbersCopy = [];
i = -1;
while (++i < nestedNumbers.length) {
numbersCopy[i] = nestedNumbers[i];
}
numbersCopy[0].push(300);
console.log(nestedNumbers, numbersCopy);
// [[1, 300], [2]]
// [[1, 300], [2]]
// They've both been changed because they share references
4. Array.map (неглубокая копия)
Вернуться на современную территорию, мы найдем карта функция. Укоренившаяся в математике , карта Является ли концепция преобразования набора в другой тип набора, при сохранении структуры.
На английском языке это означает Array.map Возвращает массив одной и той же длины каждый раз.
Чтобы удвоить список номеров, используйте карта с Двойной функция.
numbers = [1, 2, 3]; double = (x) => x * 2; numbers.map(double);
Как насчет клонирования ??
Правда, эта статья о клонирующих массивах. Дублировать массив, просто верните элемент в свой карта вызов.
numbers = [1, 2, 3]; numbersCopy = numbers.map((x) => x);
Если вы хотите быть немного более математическим, (х) => х называется Личность Отказ Это возвращает любой параметр, который он был дан.
Карта (личность) клоны списка.
identity = (x) => x; numbers.map(identity); // [1, 2, 3]
Примечание: Это также назначает объекты/массивы по Ссылка вместо ценность Отказ
5. Array.filter. (Неглубокая копия)
Эта функция возвращает массив, как карта , но это не гарантируется одинаковую длину.
Что делать, если вы фильтруете для четных чисел?
[1, 2, 3].filter((x) => x % 2 === 0); // [2]
Длина входного массива была 3, но полученная длина составляет 1.
Если ваш Фильтр предикат всегда возвращается правда Однако вы получаете дубликат!
numbers = [1, 2, 3]; numbersCopy = numbers.filter(() => true);
Каждый элемент передает тест, поэтому он возвращается.
Примечание: Это также назначает объекты/массивы по Ссылка вместо ценность Отказ
6. Массив (Неглубокая копия)
Я почти чувствую себя плохо, используя Уменьшить клонировать массив, потому что это намного сильнее, чем это. Но здесь мы идем …
numbers = [1, 2, 3];
numbersCopy = numbers.reduce((newArray, element) => {
newArray.push(element);
return newArray;
}, []);
Уменьшить Преобразует начальное значение, так как он проходит через список.
Здесь начальное значение – это пустой массив, и мы заполняем его каждым элементом, поскольку мы идем. Этот массив должен быть возвращен из функции, которая будет использоваться в следующей итерации.
Примечание: Это также назначает объекты/массивы по Ссылка вместо ценность Отказ
7. Array.slice (Неглубокая копия)
ломтик Возвращает мелкий Копия массива на основе предоставленного индекса запуска/конечного индекса, которую вы предоставляете.
Если мы хотим первые 3 элемента:
[1, 2, 3, 4, 5].slice(0, 3); // [1, 2, 3] // Starts at index 0, stops at index 3
Если мы хотим все элементы, не давайте никаких параметров
numbers = [1, 2, 3, 4, 5]; numbersCopy = numbers.slice(); // [1, 2, 3, 4, 5]
Примечание: Это мелкий Скопируйте, так что это также назначает объекты/массивы по Ссылка вместо ценить .
8. Json.parse и json.stringify (глубокая копия)
JSON.Stringify превращает объект в строку.
Json.parse превращает строку в объект.
Сочетание их может повернуть объект в строку, а затем отменить процесс для создания совершенно новой структуры данных.
Примечание: этот Безопасные копии глубоко вложенные объекты/массивы !
nestedNumbers = [[1], [2]]; numbersCopy = JSON.parse(JSON.stringify(nestedNumbers)); numbersCopy[0].push(300); console.log(nestedNumbers, numbersCopy); // [[1], [2]] // [[1, 300], [2]] // These two arrays are completely separate!
9. Array.Concat. (Неглубокая копия)
Concat Сочетает в себе массивы со значениями или другими массивами.
[1, 2, 3].concat(4); // [1, 2, 3, 4] [1, 2, 3].concat([4, 5]); // [1, 2, 3, 4, 5]
Если вы ничего не даете или пустой массив, неглубокая копия возвращается.
[1, 2, 3].concat(); // [1, 2, 3] [1, 2, 3].concat([]); // [1, 2, 3]
Примечание: Это также назначает объекты/массивы по Ссылка вместо ценность Отказ
10. Array.rom. (Неглубокая копия)
Это может превратить любой счетчивый объект в массив. Давая массив возвращает неглубокую копию.
numbers = [1, 2, 3]; numbersCopy = Array.from(numbers); // [1, 2, 3]
Примечание: Это также назначает объекты/массивы по Ссылка вместо ценность Отказ
Заключение
Ну, это было весело?
Я пытался клонировать, используя всего 1 шаг. Вы найдете много способов, если вы используете несколько методов и методов.
Оригинал: “https://www.freecodecamp.org/news/how-to-clone-an-array-in-javascript-1d3183468f6a/”