レッスンに戻る

後方参照を除外する

重要度: 5

簡単な循環参照の場合、名前で問題のあるプロパティをシリアル化から除外できます。

しかし、名前が循環参照と通常のプロパティの両方で使用される場合があるため、名前を使用できない場合があります。そのため、値でプロパティをチェックできます。

meetupを参照するプロパティを削除しつつ、すべて文字列化するreplacer関数を記述してください。

let room = {
  number: 23
};

let meetup = {
  title: "Conference",
  occupiedBy: [{name: "John"}, {name: "Alice"}],
  place: room
};

// circular references
room.occupiedBy = meetup;
meetup.self = meetup;

alert( JSON.stringify(meetup, function replacer(key, value) {
  /* your code */
}));

/* result should be:
{
  "title":"Conference",
  "occupiedBy":[{"name":"John"},{"name":"Alice"}],
  "place":{"number":23}
}
*/
let room = {
  number: 23
};

let meetup = {
  title: "Conference",
  occupiedBy: [{name: "John"}, {name: "Alice"}],
  place: room
};

room.occupiedBy = meetup;
meetup.self = meetup;

alert( JSON.stringify(meetup, function replacer(key, value) {
  return (key != "" && value == meetup) ? undefined : value;
}));

/*
{
  "title":"Conference",
  "occupiedBy":[{"name":"John"},{"name":"Alice"}],
  "place":{"number":23}
}
*/

ここでは、valueがmeetupである状況が最初の呼び出しで通常であることを除外するために、key==""もテストする必要があります。