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

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

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

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Q&A

解決済

1回答

449閲覧

vue cli :キーワード(名前)と金額(◯円以上◯円以下)での絞り込みについて

hihamo

総合スコア2

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

0グッド

0クリップ

投稿2021/05/30 03:28

前提・実現したいこと

下記イメージ画像のように、名前と金額(◯円以上◯円以下)から絞り込みをしたいと思っております。

色々なサイトを参考にさせていただき、下記のコードを考えてみたのですが
実現したい絞り込みができません。
(金額での絞り込みはできますが、名前からの絞り込みができません)

下記コードの間違いをご教授いただければ幸いです。
よろしくお願いいたします。

尚、参考にさせていただいたサイトですが
色々検索しすぎて参照元がわからなくなってしまいました。申し訳ありません。

イメージ説明

該当のソースコード

html

1<!-- 名前検索 --> 2<div class="search"> 3 <input type="text" v-model="search"> 4</div> 5<p>{{ search }}</p> 6 7<!-- 金額タグ検索 --> 8<ul> 9 <li v-for="(target, index) in targets" v-bind:key="index"> 10 <input type="checkbox" :id="target" v-bind:value="target" v-model="selectedTargets"> 11 <label :for="target">{{ target }}</label> 12 </li> 13</ul> 14<p>{{ selectedTargets }}</p> 15 16<!-- 検索結果 --> 17<ul> 18 <li v-for="item in itemsList" v-bind:key="item.id"> 19 <p>{{ item.name }}</p> 20 <p>{{ item.price }}</p> 21 </li> 22</ul>

js

1export default{ 2 data(){ 3 return{ 4 items:[ 5 { "id": 1, "name":"あああ", "price":500}, 6 { "id": 2, "name":"いいい", "price":30000}, 7 { "id": 3, "name":"ううう", "price":6000} 8 ], 9 //名前から検索 10 search: '', 11 //金額から検索 12 targets: ['5,000円以下','5,001円~10,000円','10,001円以上'], 13 filtersAsPrice: { 14 '5,000円以下': [0, 5000], '5,001円~10,000円': [5001, 10000], '10,001円以上': [10001, 1000000] 15 }, 16 selectedTargets: [] 17 } 18 }, 19 computed: { 20 itemsList(){ 21 return this.filterByPrice(this.filterByName(this.items)) 22 } 23 }, 24 methods: { 25 filterByName: function() { 26 if(this.search.length > 0){ 27 return this.items.filter(item => !item.name.indexOf(this.search)) 28 } else { 29 return this.items 30 } 31 }, 32 filterByPrice: function(){ 33 return this.items.filter(item => { 34 if(this.selectedTargets.length > 0){ 35 let priceReturn 36 Object.keys(this.filtersAsPrice) 37 .filter(priceRange=> 38 this.selectedTargets.includes(priceRange) 39 ) 40 .filter(priceRangeFiltered => { 41 let low = this.filtersAsPrice[priceRangeFiltered][0] 42 let high = this.filtersAsPrice[priceRangeFiltered][1] 43 if (item.price >= low && item.price <= high) { 44 priceReturn = item 45 } 46 }) 47 return priceReturn 48 } else { 49 return this.items 50 } 51 }) 52 }, 53 } 54} 55

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

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

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

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

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

guest

回答1

0

ベストアンサー

名前での絞り込みであるfilterByNameメソッド自体は問題なく絞り込みが行えていますが、金額での絞り込みのfilterByPriceがもともとのitemsを使っているのでfilterByNameで絞り込んだ結果が利用されていません。

以下filterByPriceの修正例です。

diff

1- filterByPrice: function () { 2- return this.items.filter((item) => { 3+ filterByPrice: function (items) { // ここで引数にして受け取る 4+ return items.filter((item) => { 5 if (this.selectedTargets.length > 0) { 6 let priceReturn 7 Object.keys(this.filtersAsPrice) 8 .filter((priceRange) => this.selectedTargets.includes(priceRange)) 9 .filter((priceRangeFiltered) => { 10 let low = this.filtersAsPrice[priceRangeFiltered][0] 11 let high = this.filtersAsPrice[priceRangeFiltered][1] 12 if (item.price >= low && item.price <= high) { 13 priceReturn = item 14 } 15 }) 16 return priceReturn 17 } else { 18- return this.items 19+ return items 20 } 21 }) 22}, 23 },

投稿2021/05/30 06:01

fuuga

総合スコア28

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

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

hihamo

2021/05/30 06:43

ご回答ありがとうございます。無事絞り込みができました! 名前での検索結果を使わずに、もともとのitemsデータを使って検索していたためなんですね。 自分では気づけませんでした。ありがとうございました。 *** 一点追加で質問をさせていただいてもよいでしょうか。 返り値のpriceReturnにつきまして、最初にlet priceReturnと定義していますが 変数は、「let ◯◯ = 〜 」という定義方法でなくても良いのですか? 参考にさせていただいたコードがこのようになっていた為 そのまま使わせて頂いたのですが、気になっていたことを思い出しました。 別件かつ初歩的な質問で申し訳ございません。 もし教えていただければ有難いです。 ご検討よろしくお願いいたします。
fuuga

2021/05/30 09:09

変数を事前に準備しているだけであればこの方法で問題ありません。(文法的にもエラーにはなりません) `let priceReturn`という書き方は`let priceReturn = undefined`と書いているのと同じものです。 ※undefinedとは値が未定義の状態を指します。(nullとは違います)
hihamo

2021/05/30 09:44

ありがとうございます。 let priceReturn = undefined と書いているのと同じという点が特にわかりやすく 理解できた気がしました。 nullとは違うという点も言及してくださって、改めて違いを確認できました。 ご回答くださいまして本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問