1.Оператор распространения (мелкая копия)
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];
2.Старый добрый for () Loop (Shallow copy)
Я полагаю, что этот подход наименее популярен, учитывая, как модное функциональное программирование стало в наших кругах.Чистый или нечистый, декларативный или императивный, он выполняет свою работу!
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.Array.map (мелкая копия)
Чтобы удвоить список чисел, используйте карту с двойной функцией.
numbers = [1, 2, 3];
double = (x) => x * 2;
numbers.map(double);
4.Array.filter (Shallow copy)
Эта функция возвращает массив, как и map, но она не гарантированно имеет одинаковую длину.
Что делать, если вы фильтруете дажечисла?
[1, 2, 3].filter((x) => x % 2 === 0)// [2]
Длина входного массива была 3, но результирующая длина равна 1.
Если предикат вашего фильтра всегда возвращает true, однако, вы получите дубликат!
numbers = [1, 2, 3];numbersCopy = numbers.filter(() => true);
Каждый элемент проходит тест, поэтому он возвращается.
Примечание: Это также назначает объекты / массивы по ссылке, а не по значению.
5.Array.reduce (Shallow copy)
Я почти чувствую себя плохо, используя Reduce для клонирования массива, потому что он намного мощнее этого.Но здесь мы идем ...
numbers = [1, 2, 3];
numbersCopy = numbers.reduce((newArray, element) => {
newArray.push(element);
return newArray;
}, []);
при уменьшении преобразует начальное значение при циклическом просмотре списка.
Здесь начальное значение является пустым массивом, и мы заполняем его каждым элементомкак мы идем.Этот массив должен быть возвращен из функции, которая будет использоваться в следующей итерации.
Примечание: Это также назначает объекты / массивы по ссылке, а не по значению.