Самый производительный способ глубокого копирования объектов JavaScript - PullRequest
0 голосов
/ 10 ноября 2018

Я хотел глубоко скопировать некоторые объекты в javascript, чтобы мой редуктор был чистым в редуксе. Некоторые свойства имеют 1 уровень вложенности, а некоторые имеют 2, а некоторые имеют 3 типа:

var x = {a:9}, y:{a:{b:9}}, z = {a:{b:{c:9}}};

Так что я должен использовать другую технику, такую ​​как:

var newX = {...x}, newY = {a:{...y.a}}

Должен ли я продолжать использовать ту же технику в цикле - напишите мою собственную глубокую копию для вложенности 3 уровня или я должен просто использовать:

var newZ = JSON.parse(JSON.stringify(z));

чтобы создать мою глубокую копию.

Какой самый быстрый способ альтернативы JSON.parse (JSON.stringify (value)) ??

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Я использую эту функцию, найденную где-то в StackOverflow:

const deepCopy = origin => {
  let cp;
  switch (typeof origin) {
    case 'object':
      if (origin === null) {
        cp = null;
      } else {
        switch (toString.call(origin)) {
          case '[object Array]':
            cp = origin.map(deepCopy);
            break;
          case '[object Date]':
            cp = new Date(origin);
            break;
          case '[object ReqExp]':
            cp = new RegExp(origin);
            break;

          default:
            cp = Object.keys(origin).reduce((prev, key) => {
              prev[key] = deepCopy(origin[key]);
              return prev;
            }, {});
            break;
        }
      }
      break;

    default:
      cp = origin;

  }
  return cp;
}
0 голосов
/ 10 ноября 2018

Если вы действительно хотите глубокое клонирование, самый эффективный способ на мой взгляд - это трюк JSON-анализа / stringify, о котором вы уже упоминали.

В противном случае вам придется вернуться к какой-то стратегии рекурсивного клонирования. Lodash имеет функцию deepClone например.

В качестве альтернативы глубокому клонированию я настоятельно рекомендую immer , который использует концепцию, называемую структурное разделение , в которой неизмененные части объекта не клонируются. Это более производительно и использует меньше памяти.

...