質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

75閲覧

Nuxt.js で多階層の連想配列を URL パラメーターに渡したい

poliphilus

総合スコア150

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/03/28 03:45

編集2024/03/28 03:51

実現したいこと

タイトルの通りですが、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 に変換するようにしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。

  • router の stringifyQueryparseQuerynuxt.config.js に直接書かねばならない
  • ネストした配列をURLパラメーターにするには qs を使う方がラク

Nuxt.js

1// nuxt.config.js 2 3import qs from 'qs'; 4 5export default { 6 // ...その他の設定 7 router: { 8 stringifiyQuery: qs.stringify, 9 parseQuery: qs.parse, 10 ... 11 } 12};

ただ当方の環境ではなぜか qs が機能せず、仕方なく stringify/parse は自作しました。

投稿2024/04/02 07:40

poliphilus

総合スコア150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問