Рубрики
Без рубрики

Как клонировать массив в JavaScript

JavaScript много способов сделать что-нибудь. Я написал 10 способов написать трубу / составить в JavaScript, и теперь мы делаем массивы. 1. Оператор распространения (неглубокому копии) с момента снижения ES6, это был самый популярный метод. Это короткий синтаксис, и вы найдете

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/”