ECMAScript5 глубокая копия объекта и массивов - PullRequest
3 голосов
/ 11 ноября 2011

Я надеюсь найти пример кода для глубокого копирования объектов в ECMAScript5.

Копирование должно быть в состоянии клонировать

  • Вложенные объекты

  • Вложенные массивы

  • Вложенные объекты в массивах (клонировать каждый элемент массива индивидуально)

Примечание:jQuery.extend (), похоже, не обрабатывает случай 3).Кроме того, я надеюсь сделать это в чистом ECMAScript.Быстрый поиск в Google не привел к достойным реализациям.

Ответы [ 3 ]

1 голос
/ 26 февраля 2015

если вы хотите использовать однострочник (удаляет ссылки на объекты путем итерации по ссылочным объектам для извлечения примитивов, объединяет одну большую строку, а затем анализирует строку в новый объект со своими собственными примитивными конечными узлами)

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;
}

сравнение производительности

1 голос
/ 25 февраля 2012

Я наконец остановился на jQuery.extend(), так как не смог найти другие хорошие реализации

http://api.jquery.com/jQuery.extend/

0 голосов
/ 29 февраля 2012

Используйте эмуляцию метода 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>
...