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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

解決済

2回答

541閲覧

連想配列から変数で値を抜き出したい

BTB

総合スコア136

JavaScript

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

0グッド

0クリップ

投稿2021/05/30 09:58

前提・実現したいこと

連想配列の変数から値を抜き出すときに、変数を使ってvalueを抜き出したいのですが、
ネストになっているキーを変数で指定する方法がわからず困っております。

教えていただけると幸いです。

該当のソースコード

js

1const player = { "name": "Ronaldo", "team": "Juventus" , "detail": { "age":23, "height":180 }} 2const key = 'name' 3console.log(player[key]) // Ronaldo

このとき、detail配下のageを一つの変数で指定して取得したいです。

試したこと

player['detail']['age'] // 変数(key)によるキー指定で取得できるようにしたい // NG例 const key = 'detail.age' player[key] // undefined player.key // undefined

この方法で取得はできるのですが美しくなく、もっと良い方法がある気がしております。

let key = 'detail.age' let player = { "name": "Ronaldo", "team": "Juventus" , "detail": { "age":23, "height":180 }} temp = key.split('.') if (temp.length >1) { player[temp[0]][temp[1]] } else { player[temp[0]] }

宜しくおねがいします。

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

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

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

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

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

guest

回答2

0

たとえばこんなかんじでどうでしょう。

javascript

1function get_data(player, key) { 2 if (typeof key == "string") return player[key] 3 let [key1,key2] = key 4 return player[key1][key2] 5} 6 7let player = { "name": "Ronaldo", "team": "Juventus" , "detail": { "age":23, "height":180 }} 8 9console.log(get_data(player,"name")) 10console.log(get_data(player,["detail","age"]))

--- 追記 ---
もしご質問のような書式を使いたいなら

javascript

1function get_data(player, key) { 2 let [key1,key2] = key.split('.') 3 if (typeof key2 == "undefined") return player[key] 4 return player[key1][key2] 5} 6 7let player = { "name": "Ronaldo", "team": "Juventus" , "detail": { "age":23, "height":180 }} 8 9console.log(get_data(player,"name")) 10console.log(get_data(player,"detail.age"))

投稿2021/05/30 11:31

編集2021/05/30 11:48
takasima20

総合スコア7458

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

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

BTB

2021/05/30 12:22

コメントありがとうございます。確かにタイプで判別する方法もありですね。参考にさせていただきます。
guest

0

ベストアンサー

. で区切って順次アクセスするのはどうでしょうか。

javascript

1let result = player 2key.split('.').forEach((key) => { 3 result = result[key] 4})

投稿2021/05/30 11:23

yh1224

総合スコア653

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

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

BTB

2021/05/30 12:21 編集

コメントありがとうございます。 非常にスッキリした式ですね。階層がさらに深くなっても対応できる内容で汎用性が高いため、こちらをベストアンサーにさせていただきました。 以下自分の理解用に出力したものを貼ります ```js let nums = ['detail','age']; let player = { "name": "Ronaldo", "team": "Juventus" , "detail": { "age":23, "height":180 }} let result1 = nums.reduce((prev, current, index, array) => { console.log('prev:',prev, 'current:',current, 'index:',index, 'array:',array,'v[k]:',prev[current]); return prev[current]; }, player); console.log(result1); // prev: {name: "Ronaldo", team: "Juventus", detail: {…}} current: detail index: 0 array: (2) ["detail", "age"] v[k]: {age: 23, height: 180} // prev: {age: 23, height: 180} current: age index: 1 array: (2) ["detail", "age"] v[k]: 23 // 23 ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問