TypeScriptのMap<K, V>をJSON.stringify()に食わせると空のオブジェクトになって困るんですけどって時
(TypeScriptに限らずJavaScriptでもだいたいこのような感じだと思いますが)
例えば以下のようなコードを書くと,出力としては {"body":{}}
が得られます.
const body = new Map<string, string>().set("foo", "bar"); console.log(JSON.stringify({body}));
本当は {"body": {"foo": "bar"}}
のような構造がほしいところにこれでは困るわけですね.
そこでどうするかと言うと Object.fromEntries()
を利用すると良い:
2019年11月現在だと比較的新しい機能ですね.
const body = new Map<string, string>().set("foo", "bar"); console.log(JSON.stringify({body: Object.fromEntries(body)}));
このようにするとめでたく {"body": {"foo": "bar"}}
という構造が得られる.ヤッター!!
これはid:sugyanさんに教えていただきました.ありがとうございます!
Object.fromEntries() ?
— すぎゃーん💯 (@sugyan) November 12, 2019
なお注意点としては以下のとおりです
- node 12以降のバージョン (もしくは対応ブラウザ) が必要.MDNのページでサポート状況をご確認ください.
- tsconfigのlibの指定に
es2019
を指定する必要あり
以上です.助かりましたね.
[追記]
JavaScriptの場合について記す (環境はnode v12.13.0).
const body = new Map().set("foo", "bar"); console.log(JSON.stringify({body})); // => {}
const body = new Map().set("foo", "bar"); console.log(JSON.stringify({body: Object.fromEntries(body)})); // => {"body": {"foo": "bar"}}
同じような感じですね.
[追記ここまで]
以下はやり取りのおまけです.
うおー,ES6の `Map<K, V>` をJSON.stringify (というかObject化) すると `{}` になるの全く知らなかった!!!
— moznion (@moznion) November 12, 2019
つJSON.stringify([...map])
— アラサーペンネくん🍝 (@pastak) November 12, 2019
それやると `[["unko", "daisuki"]]` みたいな感じにならない? `{"unko": "daisuki"}` になってほしいのだけど
— moznion (@moznion) November 12, 2019
たしかに。気合でやるかなんか適当なグッズ持ってきて使いましょう
— アラサーペンネくん🍝 (@pastak) November 12, 2019
結局こうよ
— moznion (@moznion) November 12, 2019
const body = meta ? meta : new Map<string, string>();
body.set(this.messageAttributeName, msg);
const bodyObj = {};
for (const [key, value] of body.entries()) {
bodyObj[key] = value;
}
{k:Symbol()}が{}になるのも趣ある
— 限界シェアハウスみたいなTL (@mizchi) November 12, 2019