Чтобы клонировать/копировать содержимое массива, все, что вам нужно сделать, это вызвать метод 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

Редактировать