Ответ 1
Если целевой массив еще не существует, вы можете использовать slice()
или concat()
; slice()
(или slice(0)
, но аргумент по умолчанию 0
), вероятно, более идиоматичен:
var destinationArray = sourceArray.slice(); // Probably more idiomatic
// or
var destinationArray = sourceArray.concat();
Как и в ES2015 (aka ES6), там также Array.from
, который создает новый массив из любой подобной массиву вещи (включая фактический массив):
var destinationArray = Array.from(sourceArray);
(Array.from
может быть отстроена/полина для старых движков JavaScript.)
После этого оба массива будут иметь одинаковое содержимое. Изменение одного массива не изменит другого. Естественно, если запись массива является объектом, запись для этого объекта в обоих массивах будет указывать на один и тот же объект; это не "глубокая" копия.
Если массив назначения существует и вы хотите добавить к нему содержимое исходного массива, вы можете использовать push
:
destinationArray.push.apply(destinationArray, sourceArray);
Это работает, вызывая push
в целевом массиве с использованием функции apply
функций JavaScript, которая позволяет вам указывать аргументы для вызова функции как массива. push
будет вызывать столько элементов, сколько имеет аргументы, поэтому он копирует элементы из исходного массива в целевой массив.
В ES2015 и более поздних версиях вы можете сделать этот фильтр с обозначением распространения (...
):
destinationArray.push(...sourceArray);
Здесь версия ES5:
var source1, dest1, source2, dest2;
snippet.log("If dest doesn't exist yet:");
source1 = [1, 2, 3, 4];
dest1 = source1.slice(0);
snippet.log("[before change] source1 = " + source1.join(", "));
snippet.log("[before change] dest1 = " + dest1.join(", "));
source1[2] = "three";
dest1[3] = "four";
snippet.log("[after change] source1 = " + source1.join(", "));
snippet.log("[after change] dest1 = " + dest1.join(", "));
snippet.log("If dest already exists and we're just appending:");
source2 = [1, 2, 3, 4];
dest2 = ['a', 'b', 'c', 'd'];
snippet.log("[before append] source2 = " + source2.join(", "));
snippet.log("[before append] dest2 = " + dest2.join(", "));
dest2.push.apply(dest2, source2);
snippet.log("[before change] source2 = " + source2.join(", "));
snippet.log("[before change] dest2 = " + dest2.join(", "));
source2[2] = "three";
dest2[7] = "four";
snippet.log("[after change] source2 = " + source2.join(", "));
snippet.log("[after change] dest2 = " + dest2.join(", "));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>