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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

Q&A

解決済

1回答

7409閲覧

【Vue.js】多次元配列から特定の値を探し、配下の配列を取得する

退会済みユーザー

退会済みユーザー

総合スコア0

Vue.js

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

0グッド

0クリップ

投稿2020/08/30 00:29

編集2020/08/30 00:51

多次元配列のdataから、1つ目の選択によって2つ目のselectのoptionが決まり、2つ目のselectの選択よにって3つ目のselectのoptionが決まるものを作りたいです。

例)
■ 配列
スポーツ - 地上のスポーツ(サッカー, 野球)
スポーツ - 水中のスポーツ(水泳, 水球)
食事 - 野菜(キャベツ, レタス)
食事 - 果物(ぶどう, りんご)

HTML

1<select> 2 <option>スポーツ</option> 3 <option>食事</option> 4</select> 5 6// ↑ 「食事」を選択 7 8<select> 9 <option>野菜</option> 10 <option>果物</option> 11</select> 12 13// ↑ 「野菜」を選択 14 15<select> 16 <option>キャベツ</option> 17 <option>レタス</option> 18</select>

  
上記を実現したく、下記のようなコードを作りましたが、うまくいきませんでした。

html

1<div id="app"> 2 <div> 3 <select name="asset" v-model="itemSelect"> 4 <option v-for="(item, index) of items" :key="item.index" :value="item.name">{{ item.name }}</option> 5 </select> 6 </div> 7 <div> 8 <select name="use" v-model="typeSelect"> 9 <option v-for="(type, index) of getTypes" :key="type.index" :value="type.use">{{ type.use }}</option> 10 </select> 11 </div> 12 <div> 13 <select name="detail" v-model="detailSelect"> 14 <option v-for="(detail, index) of getDetails" :key="detail.index" :value="detail.label">{{ detail.name }}</option> 15 </select> 16 </div> 17 <!-- <input type="text" name="life" value="1"> --> 18</div>

vue.js

1new Vue({ 2 el: "#app", 3 data: function() { 4 return { 5 itemSelect: '建物', 6 typeSelect: '木造・合成樹脂造のもの', 7 detailSelect: '事務所用のもの', 8 items: [ 9 { id: 0, name: '建物', types: [ 10 { tId: 0, use: '木造・合成樹脂造のもの', details: [ 11 {label: '事務所用のもの', life: 24 }, 12 {label: '店舗用・住宅用のもの', life: 22 }, 13 {label: '飲食店用のもの', life: 20 }, 14 {label: '旅館用・ホテル用・病院用・車庫用のもの', life: 17 }, 15 {label: '公衆浴場用のもの', life: 12 }, 16 {label: '工場用・倉庫用のもの(一般用)', life: 15 }, 17 ]}, 18 { tId: 1, use: '木骨モルタル造のもの', details: [ 19 {label: '事務所用のもの', life: 22 }, 20 {label: '店舗用・住宅用のもの', life: 20 }, 21 {label: '飲食店用のもの', life: 19 }, 22 {label: '旅館用・ホテル用・病院用・車庫用のもの', life: 15 }, 23 {label: '公衆浴場用のもの', life: 11 }, 24 {label: '工場用・倉庫用のもの(一般用)', life: 15 }, 25 ]}, 26 ]}, 27 { id: 1, name: '建物附属設備', types: [ 28 { tId: 0, use: 'アーケード・日よけ設備', details: [ 29 {label: '主として金属製のもの', life: 15 }, 30 {label: 'その他のもの', life: 8 }, 31 ]}, 32 { tId: 1, use: '店舗簡易装備', details: [ 33 {label: 'aaa', life: 3 }, 34 ]}, 35 ]}, 36 ], 37 } 38 }, 39 computed: { 40 getTypes: function() { 41 // 選択中の情報を取得 42 let itemName = this.itemSelect; // 1つ目のselect 43 44 // items から選択中のnameを探す 45 const itemResult = this.items.find((v) => v.name === itemName); 46 47 // 2つ目のselectの初期値をセットする 48 this.typeSelect = this.items[itemResult.id].types[0].use; 49 50 // 2つ目のselectのoptionをセットする 51 return this.items[itemResult.id].types; 52 }, 53 getDetails: function() { 54 // 選択中の情報を取得 55 let itemName = this.itemSelect; // 1つ目のselect 56 let typeName = this.typeSelect; // 2つ目のselect 57 58 // items から選択中のuseを探す 59 const itemResult = this.items.find((v) => v.name === itemName); 60 const typeResult = this.items[itemResult.id].types.find((v) => v.use === typeName); 61 62 // 3つ目のselectの初期値をセットする 63 console.log(this.items[itemResult.id].types[typeResult.tId].details[0].label); 64 this.detailSelect = this.items[itemResult.id].types[typeResult.tId].details[0].label; 65 66 // 3つ目のselectのoptionをセットする 67 return this.items[itemResult.id].types[typeResult.tId].details; 68 69 } 70 }, 71});

3つ目のselectの初期値、及び3つ目のselectのoptionが、セットされません。

どうぞ、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

HTML側のファイルが間違っていましたm(_ _)m

HTML

1<div id="app"> 2 <div> 3 <select name="asset" v-model="itemSelect"> 4 <option v-for="(item, index) of items" :key="item.index" :value="item.name">{{ item.name }}</option> 5 </select> 6 </div> 7 <div> 8 <select name="use" v-model="typeSelect"> 9 <option v-for="(type, index) of getTypes" :key="type.index" :value="type.use">{{ type.use }}</option> 10 </select> 11 </div> 12 <div> 13 <select name="detail" v-model="detailSelect"> 14 <option v-for="(detail, index) of getDetails" :key="detail.index" :value="detail.label">{{ detail.label }}</option> 15 </select> 16 </div> 17 <!-- <input type="text" name="life" value="1"> --> 18</div>

投稿2020/08/30 00:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問