РЕДАКТИРОВАТЬ: это было помечено как дубликат вопроса о глубоком клонировании, но мой вопрос (см. Заголовок и последнюю фразу) касается способа определить, ссылается ли объект на себя, часть глубокого клонирования предназначена только для предоставления контекста
Я пытаюсь реализовать функцию, которая позволит мне глубоко копировать вложенный объект без перезаписи вложенных полей (я знаю, что lodash может решить эту проблему, но я бы предпочел не использовать ее из возможных).
Вот что я написал:
function copyObject(target, source) {
if (typeof target !== "object" || !target) {
throw 'target nust be a non-null javascript object';
}
Object.entries(source).map(([key, value]) => {
if (typeof value === "object"
&& typeof target[key] === "object"
&& target[key] !== null) {
copyObject(target[key], value);
} else {
target[key] = value;
}
})
return target;
}
проблема в том, что эта функция войдет в бесконечный цикл, если ее исходный параметр является объектом, который ссылается на себя таким образом (потому что он всегда будет вызывать себя в свойстве c источника):
let src = {
a: "a",
b: "b",
}
src.c = src;
есть ли способ узнать, является ли ссылка частью объекта? Я думаю, что в C это было бы возможно, если посмотреть на адреса памяти, но в JS я не знаю.