JSON.stringifyで無視したいプロパティがある場合

undefinedを設定する(JSON.stringifyの制限を利用する)

JSONはデータのみのマルチ言語仕様なので、JavaScript固有のオブジェクトプロパティの一部は JSON.stringify ではスキップされます。

以下は無視されます。

  • 関数プロパティ(メソッド)
  • シンボルキーと値
  • undefined を格納しているプロパティ

なので、手っ取り早く無視したいプロパティにはundefinedを設定する。

replacerでundefinedを設定する

undefinedを設定するという部分に違いはないのですが、undefinedを設定するタイミングが少し違います。
JSON.stringifyの第二引数でreplacerというfunctionを設定できるのでこれを使います。

例えば以下のようなデータがあるとします。
roomとmeetupが循環参照しているのでoccupiedByを無視したいというケースです。

let room = {
  number: 23
};

let meetup = {
  title: "Conference",
  participants: [{name: "John"}, {name: "Alice"}],
  place: room // meetup は room を参照
};

room.occupiedBy = meetup; // room は meetup を参照

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

ただ、少し気になるのがオブジェクトを走査しているような動きなので、オブジェクト生成時にundefinedを設定できるならそのほうがいいのかもしれません。

ちなみに、replacerの内側でのthisの値は現在のプロパティを含むオブジェクトです。