Используйте стек.
Если, обрабатывая данные, натыкаетесь на объект, надо сохранить в стек текущее состояние - ссылку на копируемые данные, индекс текущего элемента, ссылку на объект, куда копируете; затем установить новое состояние - копируемыми данными будет массив пар ключ-значение встреченного объекта, индекс обнуляется (на самом деле надо выставить -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[''];
}
как правильнее всего будет это сделать?
Перестать заниматься ерундой и начать использовать готовые решения.
Например.