🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Nuxt.js

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

JavaScript

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

Q&A

解決済

1回答

808閲覧

javascriptで条件検索

tktail

総合スコア72

Nuxt.js

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

JavaScript

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

0グッド

1クリップ

投稿2021/03/25 06:13

nuxt.js/vuexという環境です。
ページ遷移したときにクエリーを投げて、そのクエリーを引数にvuexのgettersでデータをソートするという処理を書いています。

調べれると様々な方法があり何が正しいのか混乱しています。

ここに仮のデータを用意します。

menus = [ {name:'ハンバーグ', genre:'洋食', price:'1000'}, {name:'麻婆豆腐', genre:'中華', price:'800'}, {name:'肉じゃが', genre:'和食', price:'900',} ]

投げられるクエリーはどんなクエリーか分らないし、ない場合もある
例1)?genre=&price=1000
例2)?genre=洋食
例3)?take_out=OK

方法論として考えたのは

1,
投げられてきたクエリーがNULLのやつを除く(NULLじゃないものを新しいオブジェクトに格納する)

2,
findメソッドを使用して
新しく作ったオブジェクトのキーが、仮データのキーに存在していた場合フィルタリング
なかった場合は何もしない

3、
フィルターは以下の方法でループしていけば、最終的に欲しいデータが取れるのではないかと思いました。
1回目:新しい配列を作って、フィルターしたデータを入れる
2~?回目:先ほどの配列を使ってフィルターする
最後:リターンする

しかし、そもそもクエリーがNULLかどうかを判定するところで詰んでしまっています。

var existsQueryArray = [] for (const value of Object.entries(query)) { if(value !== null){ existsQueryArray.push() } }

これをfor文で書いたらいいのかforEachで書いた方が良いのかすら分かりません。。

何をどうしていいのか分からなくなってきましたので質問してみました。
何かヒントを頂けますでしょうか。よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. Queryをパースしkey-valueに変換
  2. null(undefined)や空文字条件をfilter
  3. すべての条件に当てはまるものだけをfilter

というフローで良いです。
型情報も入れたいのでTSになりますがサンプルコードは下の感じです。実装部分は一部割愛しているので自分で実装してみてください。(型情報だけ消せばJSでも動作するコードです。)

typescript

1 2interface Condition{ 3 key: string, 4 value: string 5} 6 7function parseQuery(query: string): Condition[] { 8 //?genre=&price=1000 => [ ["genre",""], ["price","1000"]] 9 // に変換して返す 10 return [ { key: "genre", value: ""}, ...] 11} 12function isMatchToAllConditions(data, conditions: Condition[]) { 13 return conditions.every(c => data[c.key] == c.value) 14} 15 16const conditions = parseQuery(query) 17 .filter( q => q.value && q.key) //Nullで無いものだけ残す 18 19const menues = [...] // データ取得 20 21const searched = menues.filter(menu => { 22 return isMatchToAllConditions(menu, conditions) 23}) 24 25

投稿2021/03/25 08:13

編集2021/03/25 08:14
takezoux2

総合スコア6

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

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

tktail

2021/03/25 16:22

ご指南頂きありがとうございます。 export const getters = { getFilteringList: (state) => (query) => { // queryの形式を[{key:'',value:''}...]に変換する let conversion = Object.entries(query).map(([key, value]) => ({'key': key, 'value': value})) // 条件に合致したデータを返す関数を定義 function isMatchToAllConditions(data, conditions){ return conditions.every(c => data[c.key] == c.value) } // null以外の要素を取り出す const conditions = conversion.filter(q => q.value && q.key) // フィルターをかける const searched = state.data.filter(list => { return isMatchToAllConditions(list, conditions) }) // 出力 return searched } } 頂いたサンプルコードを参考にし、以上のようなコードで解決することが出来ました。 自分の中でも何度もフィルターをかけるのって変だなと思いつつ、AND演算子やOR演算子で実装できそうな気もしないしヤキモキしていました。 まだまだ課題は山積みなのですが、おかげさまで3日悩んだことが晴れました。 この度はありがとうございました。 またご縁がありましたら、是非宜しくお願い致しますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問