Виключити зворотні посилання
важливість: 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
.