Виключити зворотні посилання
важливість: 5
У простих випадках циклічних посиланнь ми можемо виключити від серіалізації властивість, через яку воно виникло, за її ім’ям.
Але іноді ми не можемо просто використовувати назву, оскільки вона може використовуватися як і у циклічних посиланнях, так і в звичайних, потрібних нам, властивостях. Таким чином, ми можемо перевірити властивість за її значенням.
Напишіть функцію replacer, щоб серіалізувати все, але видалити властивості, які посилаються на meetup:
let room = { number: 23 }; let meetup = { title: "Конференція", occupiedBy: [{name: "Іван"}, {name: "Аліса"}], place: room }; // циклічне посилання room.occupiedBy = meetup; meetup.self = meetup; alert( JSON.stringify(meetup, function replacer(key, value) { /* ваш код */ })); /* результат повинен бути: { "title":"Конференція", "occupiedBy":[{"name":"Іван"},{"name":"Аліса"}], "place":{"number":23} } */ let room = { number: 23 }; let meetup = { title: "Конференція", occupiedBy: [{name: "Іван"}, {name: "Аліса"}], place: room }; room.occupiedBy = meetup; meetup.self = meetup; alert( JSON.stringify(meetup, function replacer(key, value) { return (key != "" && value == meetup) ? undefined : value; })); /* { "title":"Конференція", "occupiedBy":[{"name":"Іван"},{"name":"Аліса"}], "place":{"number":23} } */ Тут нам також потрібно перевірити key=="", щоб виключити перший виклик, де значення value рівне meetup.