実現したいこと
タイトルの通りですが、Nuxt.js (ver.2) でネストした多階層の連想配列を URL パラメーターにしたいです。
発生している問題・分からないこと
1次元の配列なら this.$router.push({ query: arr })
で問題なく動作しますが、多階層になると値が [object Object]
になってしまいます。これを正常にしたいです。parseQuery / stringifyQuery
というのを設定すればいいようで、ChatGPT にも助けを求めましたがダメでした。よろしくお願いします。
該当のソースコード
JavaScript
1// ChatGPT が吐き出したコード 2// midleware/router.js に保存し nuxt.config.js で読み込んでいる 3 4export default function ({ app }) { 5 app.router.beforeEach((to, from, next) => { 6 // parseQueryの設定 7 app.router.options.parseQuery = queryString => { 8 const urlSearchParams = new URLSearchParams(queryString); 9 10 // クエリ文字列をパースしてオブジェクトに変換 11 const parsed = {}; 12 urlSearchParams.forEach((value, key) => { 13 parsed[key] = value; 14 }); 15 16 // オブジェクト内の各値に対して変換を適用 17 const processValue = value => { 18 if (Array.isArray(value)) { 19 return value.map(item => processValue(item)); 20 } else if (typeof value === 'object') { 21 return Object.keys(value).reduce((acc, key) => { 22 acc[key] = processValue(value[key]); 23 return acc; 24 }, {}); 25 } 26 return value; 27 }; 28 29 Object.keys(parsed).forEach(key => { 30 parsed[key] = processValue(parsed[key]); 31 }); 32 33 return parsed; 34 }; 35 36 // stringifyQueryの設定 37 app.router.options.stringifyQuery = queryObject => { 38 const urlSearchParams = new URLSearchParams(); 39 40 // 再帰的に値を処理する関数 41 const processValue = value => { 42 if (Array.isArray(value)) { 43 return value.map(item => processValue(item)); 44 } else if (typeof value === 'object') { 45 return Object.keys(value).reduce((acc, key) => { 46 acc[key] = processValue(value[key]); 47 return acc; 48 }, {}); 49 } else if (value === true) { 50 return 1; 51 } else if (value === false) { 52 return 0; 53 } 54 return value; 55 }; 56 57 // クエリオブジェクト内の各値に対して変換を適用 58 Object.keys(queryObject).forEach(key => { 59 const processedValue = processValue(queryObject[key]); 60 if (Array.isArray(processedValue)) { 61 processedValue.forEach(item => urlSearchParams.append(key, item)); 62 } else { 63 urlSearchParams.set(key, processedValue); 64 } 65 }); 66 67 return urlSearchParams.toString(); 68 }; 69 70 next(); 71 }); 72} 73
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
JavaScript
1arr = { foo:'val1', bar:'val2', baz:'val3' }; 2// ?foo=val1&bar=val2&baz=val3 に変換される 3 4arr = { 5 foo: 'val1'. 6 bar: { 7 bar2: 'val2_1', 8 bar3: 'val2_2' 9 }, 10 baz: [ 0, 2 ] 11}; 12// ?foo=val1&bar=[object Object]&baz=[object Object] になってしまう 13// ?foo=val1&bar[bar2]=val2_1&bar[bar3]=val2_2&baz[0]=0&baz[1]=2 になって欲しい
補足
stringify 時に true = 1 / false = 0 に変換するようにしています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。