Исключить обратные ссылки
важность: 5
В простых случаях циклических ссылок мы можем исключить свойство, из-за которого они возникают, из сериализации по его имени.
Но иногда мы не можем использовать имя, так как могут быть и другие, нужные, свойства с этим именем во вложенных объектах. Поэтому можно проверять свойство по значению.
Напишите функцию replacer
для JSON-преобразования, которая удалит свойства, ссылающиеся на 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}
}
*/
Функция replacer
будет вызвана для каждой пары (key, value)
, и в первом вызове будет передан специальный «объект-обёртка»: {"": meetup}
.
Если мы реализуем только проверку value == meetup
, то в результате получим undefined
. Чтобы в первом вызове replacer
не было удалено свойство, ссылающееся на meetup
, нам также нужно добавить проверку key != ""
.