$.ajax()でJavaScriptのオブジェクトをPHP側に渡そうとしたら以下のエラーが発生しました。
too much recursion
オブジェクト型ではなくstring型ならいけるかと思いJSON.stringify()して送信してみましたが今度は
TypeError: cyclic object value
というエラーが発生。
エラーについて調べて見たところ、無限ループしてしまっていたようです。
その原因は循環オブジェクト参照構造体をそのまま処理していたからでした。
参考リンク
- InternalError: too much recursion – JavaScript | MDN
- TypeError: cyclic object value – JavaScript | MDN
JSON.stringify()の第2引数には関数または配列を渡すことができ、これにより挙動をコントロールできるので変換するといいようです。
■関数を渡す
const obj = { id: 1, name: "js-primer", bio: null };
const replacer = (key, value) => {
if (value === null) {
return undefined;
}
return value;
};
console.log(JSON.stringify(obj, replacer)); // => '{"id":1,"name":"js-primer"}'
■配列を渡す
const obj = { id: 1, name: "js-primer", bio: null };
const replacer = ["id", "name"];
console.log(JSON.stringify(obj, replacer)); // => '{"id":1,"name":"js-primer"}'
id,nameプロパティだけがホワイトリストとして使われ、 その配列に含まれる名前のプロパティだけが変換されます。
参考リンク
- オブジェクトをJSON文字列に変換する ・ JavaScriptの入門書 #jsprimer
- Express のレスポンスで JSON を返すときは循環オブジェクト参照構造体に気をつけよう – Qiita
新しくオブジェクトを作って元のオブジェクトをループで回してコピーし直してもいけるかもしれません。また参照構造体にならないように一旦配列とかにデータを入れ直して。試してないのでわかりませんが。