Простое клонирование/копирование массива в JavaScript
Чтобы клонировать/копировать содержимое массива, все, что вам нужно сделать, это вызвать метод slice, передав 0
в качестве первого аргумента:
var clone = myArray.slice(0);
Код выше создает копию исходного массива; имейте в виду, если в вашем массиве существуют объекты - они хранятся как ссылки; т.е. код выше не делает “deep” клонирование содержимого массива.
Чтобы добавить копирование, как нативный метод к массивам, вы могли бы сделать что-то вроде этого:
Array.prototype.clone = function () {
return this.slice(0);
};
Давайте напишем рекурсивную функцию, чтобы копировать массив, который потенциально может иметь вложенные объекты или массивы:
function arrayClone (arr) {
var i, copy;
if (Array.isArray(arr)) {
copy = arr.slice(0);
for (i = 0; i < copy.length; i++) {
copy[i] = arrayClone(copy[i]);
}
return copy;
} else if (typeof arr === 'object') {
throw 'Cannot clone array containing an object!';
} else {
return arr;
}
}
Если вы используете Underscore – можете сделать это еще короче:
function arrayClone (arr) {
if (_.isArray(arr)) {
return _.map(arr, arrayClone);
} else if (typeof arr === 'object') {
throw 'Cannot clone array containing an object!';
} else {
return arr;
}
}
С версии ECMAScript 2015 был введен метод Object.assign(), с его помощью глубокое клонирование можно реализовать еще проще:
var clone = Object.assign([], myArray);
Заключение
Если вам нужно глубокое копирование произвольно-вложенных объектов и/или массивов, крошечный node-clone прекрасно с этим справиться. Он будет правильно обрабатывать даже копирование объектов с циклическими ссылками!
Источники
Теги: перевод, javascript