@ModelViewWithoutControl

Как записать рекурсию (функц. глубокого копирования) в виде цикла?

Здравствуйте! Я учу javascript, и у меня возник вопрос. Допустим, есть некий объект
let car = {
	name: "Title",
	color: "yellow",
	owns: {
		1:  "Иван",
		2:  "Джон",
	},
}

И я хочу клонировать этот объект в другую переменную. Есть много способов сделать это: и с помощью сторонних библиотек, и в виде рекурсии. Но если это цикл, то как правильнее всего будет это сделать?
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Используйте стек.

Если, обрабатывая данные, натыкаетесь на объект, надо сохранить в стек текущее состояние - ссылку на копируемые данные, индекс текущего элемента, ссылку на объект, куда копируете; затем установить новое состояние - копируемыми данными будет массив пар ключ-значение встреченного объекта, индекс обнуляется (на самом деле надо выставить -1, нулевое значение будет получено при переходе к следующей итерации; конечно, можно и буквально 0 выставлять, но тогда придётся усложнить работу с индексом - тут увеличиваем, а тут нет), пустой объект в качестве копии.

Если данные закончились, надо восстановить состояние из стека.

Условий, при которых возможно продолжение цикла, будет два - кроме наличия необработанных данных ещё и непустой стек.

function clone(value) {
  const clone = {};
  const stack = [];

  for (
    let i = 0, source = [ [ '', value ] ], target = clone;
    i < source.length || stack.length;
    i++
  ) {
    if (i === source.length) {
      [ i, source, target ] = stack.pop();
    } else {
      const [ k, v ] = source[i];
      const isObject = v instanceof Object;

      target[k] = isObject ? v.constructor() : v;

      if (isObject) {
        stack.push([ i, source, target ]);
        [ i, source, target ] = [ -1, Object.entries(v), target[k] ];
      }
    }
  }

  return clone[''];
}

как правильнее всего будет это сделать?

Перестать заниматься ерундой и начать использовать готовые решения. Например.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@zkrvndm
Софт для автоматизации
Самый простой вариант клонировать обьект это конвертировать его в JSON, а потом обратно. Другое дело, что это не подойдет, если в объекте есть типы данных, которые нельзя представить внутри JSON. Вам обязательно цикл нужен?
Ответ написан
@ModelViewWithoutControl Автор вопроса
Придумался вот такой вариант:
let clone = {};
for (key in car) {
	if (typeof car[key] === "object") {
		clone[key] = Object.assign({}, car[key]);
	}
	clone[key] = car[key];
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы