как поймать ссылочный цикл в объекте javascript?

РЕДАКТИРОВАТЬ: это было помечено как дубликат вопроса о глубоком клонировании, но мой вопрос (см. Заголовок и последнюю фразу) касается способа определить, ссылается ли объект на себя, часть глубокого клонирования предназначена только для предоставления контекста

Я пытаюсь реализовать функцию, которая позволит мне глубоко копировать вложенный объект без перезаписи вложенных полей (я знаю, что 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 я не знаю.


person skpn    schedule 20.01.2021    source источник
comment
Ответ на этот вопрос уже дан в: stackoverflow.com/questions/40291987/   -  person Jose Marin    schedule 20.01.2021


Ответы (1)


Если я правильно понимаю вопрос, вам следует использовать приведенный ниже код в начале функции .map.

если ( Object.is (значение, источник)) { вернуть }

Справка MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is

Object.is() определяет, являются ли два значения одним и тем же значением. Два значения считаются одинаковыми, если выполняется одно из следующих условий...

  • оба одного и того же объекта (это означает, что оба значения ссылаются на один и тот же объект в памяти)
person N. Mihajlovic    schedule 17.02.2021