我有一个包含数组的对象。我想循环使用它们。对于subjects
中的vocab
对象,parseHoveredText()的log("log: " + obj + ", " + vocab[obj][word.toLowerCase()][0]);
工作正常。
输出:log subjects, You
但是对于其他对象,例如nouns
,verbs
等,log("log: " + obj + ", " + vocab[obj][word.toLowerCase()][0]);
给出了:
输出:Cannot read property '0' of undefined
我不明白这是怎么可能的。如果我将'má' : ['Hemp', path+n+'Ma2_Hemp.mp3'],
放在subjects
对象中,它可以正常工作......所以我认为循环有问题。
因此,如果我将log
更改为log("log: " + obj + ", " + vocab[obj][word.toLowerCase()]);
:
输出:
log: subjects, undefined
log: nouns, Mother,recordings/nouns/Ma1_Mother.mp3
log: verbs, undefined
log: measure, undefined
log: adjectives, undefined
log: adverbs, undefined
log: prepositions, undefined
log: particles, undefined
log: suffix, undefined
所以它从其他对象中找到了键,因为你可以看到它从Mother
返回Nouns
。
代码:
var path = 'recordings/';
var sbj = 'subjects/';
var n = 'nouns/';
var vocab =
{
"subjects" :
{
'wǒ' : ['I/Me', path+sbj+'Wo_I.mp3'],
'nǐ' : ['You', path+sbj+'Ni_You.mp3'],
'tā' : ['Him/Her', path+sbj+'Ta_him.mp3'],
'shuí' : ['Who', path+sbj+'Shui_Who.mp3']
},
"nouns" :
{
'xièxiè': ['Thanks', path+n+'Xiexie4_Thanks.mp3'],
'duì' : ['Correct/at/facing', path+n+'Dui4_Facing.mp3'],
'má' : ['Hemp', path+n+'Ma2_Hemp.mp3'],
etc...
function parseHoveredText (word, audio) {
for (obj in vocab) {
log("log: " + obj + ", " + vocab[obj][word.toLowerCase()][0]);
if(audio) {
return vocab[obj][word.toLowerCase()][1];
}
return vocab[obj][word.toLowerCase()][0];
}
}
答案 0 :(得分:1)
看起来你的逻辑有点不对劲。发生的事情是你将一个单词(我假设为'wǒ')传递给你的parseHoveredText()函数,该函数试图引用每个词汇对象中的单词。这将始终导致noun
或任何非subject
的错误,因为它会首先尝试在subject
数组中找到该字词。
您应该可以通过将您的功能更改为:
来解决此问题function parseHoveredText (word, audio) {
for (obj in vocab) {
if(vocab[obj][word.toLowerCase()]) {
log("log: " + obj + ", " + vocab[obj][word.toLowerCase()][0]);
if(audio) {
return vocab[obj][word.toLowerCase()][1];
}
return vocab[obj][word.toLowerCase()][0];
}
}
}
答案 1 :(得分:1)
问题是如果找不到“单词”,则循环遍历词汇对象的每个元素,如果找不到“单词”,则无法执行命令日志,因为未定义变量。在javascript中,如果一行代码中断,执行将停止。因此,你不会看到你看到的日志。尝试检查是否首先定义:
function parseHoveredText (word, audio) {
for (obj in vocab) {
if(typeof vocab[obj][word.toLowerCase()] !== "undefined")
{
console.log("log: " + obj + ", " + vocab[obj][word.toLowerCase()][0]);
if(audio) {
return vocab[obj][word.toLowerCase()][1];
}
return vocab[obj][word.toLowerCase()][0];
}
}
}
jsfiddle:http://jsfiddle.net/A83pF/