ECMAScript5 глубокое копирование объектов и массивов
Я надеюсь найти пример кода для глубокого копирования объектов в ECMAScript5.
Копирование должно быть способно клонировать
-
Вложенные объекты
-
Вложенные массивы
-
Вложенные объекты в массивах (клонирование каждого элемента массива по отдельности)
Примечание: jQuery.extend (), похоже, не обрабатывает случай 3). Кроме того, я надеюсь сделать это в чистом ECMAScript. Быстрое гугление не принесло никаких достойных реализаций.
3 ответа:
Если вы хотите однострочный (удаляет ссылки на объекты путем перебора ссылочных объектов для извлечения примитивов, объединяет одну большую строку, а затем анализирует строку в новый объект с его собственными примитивными конечными узлами)
JSON.parse(JSON.stringify(obj))
Или если вам нужно выполнить много копий
function deepCopy(o) { var copy = o,k; if (o && typeof o === 'object') { copy = Object.prototype.toString.call(o) === '[object Array]' ? [] : {}; for (k in o) { copy[k] = deepCopy(o[k]); } } return copy; }
Используйте эмуляцию метода toSource для копирования объекта:
<script type="text/javascript"> Object.prototype.getSource = function() { var output = [], temp; for (var i in this) { if (this.hasOwnProperty(i)) { temp = i + ":"; switch (typeof this[i]) { case "object" : temp += this[i].getSource(); break; case "string" : temp += "\"" + this[i] + "\""; // add in some code to escape quotes break; default : temp += this[i]; } output.push(temp); } } return "{" + output.join() + "}"; } var baz = {"alpha":{"beta":{"charlie": ["delta","epsilon",{"omega":"zeta"}]}}}; !!Object.prototype.toSource ? alert((baz).toSource() ) : alert((baz).getSource() ); </script>