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

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

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

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

Lodash

Lodashは、JavaScriptのユーティリティライブラリ。Underscoreの派生ライブラリで、配列・オブジェクトの操作に便利です。また、コードの可読性も高めることができます。

JavaScript

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

825閲覧

都道府県の表示の絞り込みをしたい

wasashi

総合スコア0

Vue.js

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

Lodash

Lodashは、JavaScriptのユーティリティライブラリ。Underscoreの派生ライブラリで、配列・オブジェクトの操作に便利です。また、コードの可読性も高めることができます。

JavaScript

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/08/14 08:17

JavaScript(vue.js)で顧客管理のシステムを作っています。
都道府県とそれぞれの都道府県に属している税務署を文字列検索して、一致した税務署をフィルタする機能を実装しています。
(47都道府県に対して、税務署は、ダミーデータとして47税務署存在しています。)
フォームに文字列を入力し、検索ボタンを押下して、税務署のフィルタはできるようになったのですが、都道府県をフィルタする方法が思いつきません。

<div v-for="todoufuken in todoufukens" :key="todoufuken.id"> の「todoufukens」部分をフィルタ処理できるようにしたいです。

該当のソースコード

vue

1<template> 2 <div> 3 <nav> 4 <div> 5 <ul> 6 <li> 7 <router-link>▷ 戻る</router-link> 8 </li> 9 </ul> 10 </div> 11 </nav> 12 13 <div> 14 <div> 15 <div> 16 <input type="text" name="kokyaku_mei" id="kokyaku_mei" /> 17 <button 18 name="button" 19 type="submit" 20 @click="submitKeyword" 21 >検索</button> 22 </div> 23 </div> 24 25 <div> 26 <div>提出先</div> 27 <div>宛名</div> 28 <div>住所</div> 29 </div> 30 31 <div v-for="todoufuken in todoufukens" :key="todoufuken.id"> 32 <div> 33 <div>{{ _.get(todoufuken, "todoufuken_name") }}</div> 34 </div> 35 <div v-for="zeimusyo in filteredZeimusyos(todoufuken.id)" :key="zeimusyo.id"> 36 <div> 37 <div> 38 <a href>▷ {{ _.get(zeimusyo, "name") }}</a> 39 </div> 40 <div>{{ _.get(zeimusyo, "name") }}</div> 41 <div> 42 〒{{ _.get(zeimusyo, "yuubinbangou") }} 43 <br /> 44 {{ _.get(zeimusyo, "jyuusyo1") }} 45 </div> 46 </div> 47 </div> 48 </div> 49 </div> 50 </div> 51</template> 52 53<script> 54import { TODOUFUKENS_PATH, ZEIMUSYOS_PATH } from "@/constants/endpoints"; 55 56export default { 57 data() { 58 return { 59 keyword: "", 60 todoufukens: [], 61 zeimusyos: [], 62 }; 63 }, 64 computed: { 65 filteredTodoufukens() { 66 return this.keyword 67 ? this.todoufukens.filter((todoufuken) => todoufuken.id === 1) || {} 68 : this.todoufukens; 69 }, 70 }, 71 methods: { 72 filtered(todoufukenId) { 73 return ( 74 this.zeimusyos.filter( 75 (zeimusyo) => zeimusyo.todoufuken_id === todoufukenId 76 ) || {} 77 ); 78 }, 79 filteredZeimusyos(todoufukenId) { 80 return this.keyword 81 ? this.filtered(todoufukenId).filter((zeimusyo) => 82 zeimusyo.name.match(this.keyword) 83 ) || {} 84 : this.filtered(todoufukenId) || {}; 85 }, 86 submitKeyword() { 87 this.keyword = document.getElementById("kokyaku_mei").value; 88 }, 89 }, 90 async mounted() { 91 const response1 = await this.$http.get(`${TODOUFUKENS_PATH}`); 92 this.todoufukens = response1.data; 93 94 const response2 = await this.$http.get(`${ZEIMUSYOS_PATH}`); 95 this.zeimusyos = response2.data; 96 }, 97}; 98</script>

APIの抜粋 id:47 沖縄県まであります。

todoufukens

1[{ 2 "id": 1, 3 "todoufuken_name": "北海道", 4},]

zeimusyos

1[{ 2 "id": 1, 3 "name": "北海道税務署", 4 "yuubinbangou": "111-2222", 5 "todoufuken_id": 1, 6 "jyuusyo1": "北海道税務署住所1", 7},]

試したこと

computed

1filteredTodoufukens() { 2 return this.keyword 3 ? this.todoufukens.filter((todoufuken) => todoufuken.id === 1) || {} 4 : this.todoufukens; 5 },

上記のように書くと、北海道と検索した場合のみ成功することまでは分かりました。
ただ、このようなアプローチであっているのか正直わかっておりません。
お手数おかけいたしますがよろしくい願い致します。

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

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

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

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

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

dameo

2020/08/16 00:05

何がしたいのか?と何が出来ないのか?が両方明確ではないです。 技術的に出来ない部分が明確なのであれば、業務内容からは一旦切り離して、問題だけを含むサンプルプログラムを提示しないと、teratailでは扱えない長さになってしまいます。人による部分もありますが、回答者さんたちも、困ってるなら助けたいと思いつつも、回答するために質問意図をわざわざ聞かないといけないくらいなら、読まずに自分の作業をすると思います。 ■不明点その1 名前別のフィルタが出来るのに、都道府県別のフィルタが出来ない理由は何か? ■不明点その2 名前別のフィルタは都道府県別のフィルタと同時にかけられるのか? ■不明点その3 名前別のフィルタは都道府県別のフィルタと同時にかけられるのなら、両方指定された場合、どういう結果が出るのが正しいのか?(単純にAND条件なのか) ■不明点その4 都道府県のフィルタをしたいにも関わらず、都道府県をフィルタするINPUTがない ■不明点その5 都道府県、税務署、顧客まで全て固定値で、サーバーとのやり取りがないのに顧客管理システムとはどういうことか?ダミーだからか? こちらの推測に頼る記述が多くて確認が大変です。 まだ他にもあるのですが、疑問の核心には次回辿り着く予定です。
wasashi

2020/08/16 10:25

お忙しい中、ありがとうございます。当方の質問の仕方が悪く、多くの労力をかけさせてしまい申し訳ないです。 今回、私が実装しようとしている画面は、 税務署名を検索し、ヒットした税務署の住所などを確認、 その確認した税務署の住所などを修正する必要があった場合、 税務署名をリンクにしており、 そこから修正画面に遷移させるものとなっております。 都道府県の表示は、 その税務署がどの都道府県に存在しているかわかるように表示させているもので、検索の対象とはなっておりません。 今回の画面では、都道府県一覧をループさせて、そのループの中で、税務署一覧のループをさせており、 初期状態では、下記のような表示となるようにしています。 北海道  北海道税務署 青森県  青森税務署 岩手県  岩手税務署 ・ ・ 沖縄県  沖縄税務署 上記の初期状態から「北海道」を検索をかけた場合、 北海道  北海道税務署 となるようにしたいのですが、今の状態ですと、 北海道  北海道税務署 青森 岩手 ・ ・ ・ 沖縄県 と税務署はフィルタされるが、都道府県は、フィルタされない状態となってしまっています。 税務署の検索が行われたときに、同時に都道府県もフィルタ処理するメソッドを書きたいのですが、 そのメソッドをどのように書けば良いのか、よく分からいという状態です。
dameo

2020/08/16 10:39

このようなやりとりがいけないのですよ... 私の不明点には一切答えることなく、あなたはやりたいことを説明してるだけです。私が知りたいのはソースコード的に課題が何なのかだけなんです。あなたが作ろうとしてる何かの仕様ではありません。 しかも今回あなたが書いてることは私も大まかに把握しています。 > ■不明点その1 > 名前別のフィルタが出来るのに、都道府県別のフィルタが出来ない理由は何か? →不明 > ■不明点その2 > 名前別のフィルタは都道府県別のフィルタと同時にかけられるのか? →不明 > ■不明点その3 > 名前別のフィルタは都道府県別のフィルタと同時にかけられるのなら、両方指定された場合、どういう結果が出るのが正しいのか?(単純にAND条件なのか) →不明 > ■不明点その4 > 都道府県のフィルタをしたいにも関わらず、都道府県をフィルタするINPUTがない →税務署名の入力input#kokyaku_meiで都道府県を文字列として入力する →ただし、それが都道府県だけにかかるのか、税務署名にもかかるのか不明 > ■不明点その5 > 都道府県、税務署、顧客まで全て固定値で、サーバーとのやり取りがないのに顧客管理システムとはどういうことか?ダミーだからか? →不明 これが現状です。
wasashi

2020/08/16 11:46

すいません... 不明点に対する回答をいたします。 > ■不明点その1 > 名前別のフィルタが出来るのに、都道府県別のフィルタが出来ない理由は何か? -> 税務署のフィルタは、 methods内にあるfilteredZeimusyos(todoufukenId) メソッド内で行っています。 都道府県のフィルタは、 上記のfilteredZeimusyos(todoufukenId) メソッドでフィルタした税務署一覧の「todoufuken_id」と都道府県一覧の「id」が一致したものでフィルタしたいと考えています。 当初、コードを下記のようにしていたのですが、 filteredTodoufukens() { return this.keyword ? this.todoufukens.filter((todoufuken) => todoufuken.id === this.filteredZeimusyos().todoufuken_id || {} : this.todoufukens; }, this.filteredZeimusyosは配列を返すので、このメソッドではダメだというところまで行ったのですが、じゃあどうすれば、いいのかわからない。という状況です。 > ■不明点その2 > 名前別のフィルタは都道府県別のフィルタと同時にかけられるのか? -> かけられません。 > ■不明点その4 > 都道府県のフィルタをしたいにも関わらず、都道府県をフィルタするINPUTがない INPUTは税務署の検索に対してのみかかっています。都道府県は、税務署の「todoufuken_id」と一致する「id」でフィルタしたいです。 > ■不明点その5 > 都道府県、税務署、顧客まで全て固定値で、サーバーとのやり取りがないのに顧客管理システムとはどういうことか?ダミーだからか? -> この画面ではたまたまそうだというだけです。 よろしくお願いします。
dameo

2020/08/16 12:19

> ■不明点その1 > 名前別のフィルタが出来るのに、都道府県別のフィルタが出来ない理由は何か? まず不明点その4に関連しますが、フィルタするにもidが入力できないと困るわけで、それをどうしますか?それさえ決まれば、後は迷うこともない話だと思いますが... 税務署のフィルタが出来るのにここで詰まるようだと、お仕事なのであれば、上司の方や同僚の方と相談した方がいいかもしれません。 > ■不明点その2 > 名前別のフィルタは都道府県別のフィルタと同時にかけられるのか? かけられない→了解です。 > ■不明点その3 > 名前別のフィルタは都道府県別のフィルタと同時にかけられるのなら、両方指定された場合、どういう結果が出るのが正しいのか?(単純にAND条件なのか) →同時にかけられない > ■不明点その4 > 都道府県のフィルタをしたいにも関わらず、都道府県をフィルタするINPUTがない →税務署フィルタ用のINPUTとは別に用意したい。が、どんなものか不明。 →まずは決めてください。 > ■不明点その5 > 都道府県、税務署、顧客まで全て固定値で、サーバーとのやり取りがないのに顧客管理システムとはどういうことか?ダミーだからか? →この画面では実際にサーバーとのやり取りはない というわけで、まずはソースコード上で4を解決してください。
wasashi

2020/08/16 12:26

ありがとうございます。4を解決できるよう考えてみます。 休日にやりとりしていただき感謝します。
guest

回答1

0

自己解決

修正前

vue

1<div v-for="todoufuken in todoufukens" :key="todoufuken.id"> 2 <div> 3 <div>{{ _.get(todoufuken, "todoufuken_name") }}</div> 4 </div> 5 <div v-for="zeimusyo in filteredZeimusyos(todoufuken.id)" :key="zeimusyo.id"> 6 <div> 7 <a href>▷ {{ _.get(zeimusyo, "name") }}</a> 8 </div> 9</div>

修正後

vue

1<div v-for="todoufuken in todoufukens" :key="todoufuken.id"> 2 <div v-for="zeimusyo in filteredZeimusyos(todoufuken.id)" :key="zeimusyo.id"> 3 <div> 4 <div>{{ _.get(getTodoufuken(zeimusyo.todoufuken_id), "todoufuken_name" }}</div> 5 </div 6 <div> 7 <a href>▷ {{ _.get(zeimusyo, "name") }}</a> 8 </div> 9</div>

メソッド追加

methods

1getTodoufuken(todoufukenId) { 2 return this.todoufukens.find( 3 (todoufuken) => todoufuken.id === todoufukenId 4 ); 5}

投稿2020/08/17 02:55

wasashi

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問