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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1103閲覧

連想配列のValue要素を取り出したいがエラーになる

foxkun

総合スコア17

多次元配列

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2019/10/22 11:03

Javascriptで 連想配列から特定の要素をランダムに取り出したいのですが
エラーになってしまいます。 以下のコードは一部です。

Jacascript

1const words = { 2 0: { word: "white", isDone: false }, 3 1: { word: "book", isDone: false }, 4 2: { word: "car", isDone: false }, 5 3: { word: "pencil", isDone: false }, 6 4: { word: "watch", isDone: false } 7 }; 8 9let wordNow; 10 11 wordNow = words[Math.floor(Math.random() * words.length)].word;

エラー内容は

main.js:60 Uncaught TypeError: Cannot read property 'word' of undefined
at HTMLParagraphElement.<anonymous> (main.js:60)

おそらく文法エラーなのですが全くわかりません。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは

ご質問に挙げられているコードのどこが拙いかというと、words は配列ではないので、words.length は意図している、 5 という数値にはならず undefined になることです。

そのため、

  • Math.floor(Math.random() * words.length) は NaN になり、
  • words[Math.floor(Math.random() * words.length)] は undefined となって、
  • words[Math.floor(Math.random() * words.length)].word は undefined のwordプロパティを読みにいこうとして、ご質問にあるエラーメッセージ

Cannot read property 'word' of undefined

が表示されます。

最小限の修正で済ませるには、

javascript

1words.length

を以下に修正してみると、いかがでしょうか?

javascript

1Object.values(words).length

または、ランダムにwordを取り出すのが目的であれば、以下のように、words のエントリの値に含まれる word の値を集めた配列wordsAryを作り、そこからランダムサンプリングすることもできます。

javascript

1onst words = { 2 0: { word: "white", isDone: false }, 3 1: { word: "book", isDone: false }, 4 2: { word: "car", isDone: false }, 5 3: { word: "pencil", isDone: false }, 6 4: { word: "watch", isDone: false } 7 }; 8 9const wordsAry = Object.values(words).map(e => e.word); 10 11let wordNow = wordsAry[Math.floor(Math.random() * wordsAry.length)]; 12 13console.log(wordNow); 14

なお上記で、wordsAry の内容は、オブジェクトリテラルに書いたとおりの順番に沿った
["white", "book", "car", "pencil", "watch"]
には必ずしもならないのですが、目的がランダムサンプリングなのであれば順番は関係ないので、上記でも要件は満たされると思います。

以上、参考になれば幸いです。

投稿2019/10/22 11:37

編集2019/10/22 13:59
jun68ykt

総合スコア9058

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

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

foxkun

2019/10/22 12:52

丁寧な解説に正直驚きました! 回答ありがとうございます、是非wordsAryの方で組んでみます!
jun68ykt

2019/10/22 13:09

どういたしまして。エラーについては解決されたようで、よかったです????
guest

0

おそらく文法エラーなのですが全くわかりません。

英語が苦手ならGoogle翻訳を使うところから。
それに珍しいエラーではないので意味や解決方法は探せば沢山出てくるものです。

エラーメッセージの読み方と対処, 検索や質問の原則

投稿2019/10/22 11:06

m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問