2014-02-08 93 views
0

我有一个包含数组的对象的对象。我想循环浏览它们。对于vocab中的subjects对象,parseHoveredText()的log("log: " + obj + ", " + vocab[obj][word.toLowerCase()][0]);工作正常。无法读取对象对象的属性'0'

输出:log subjects, You

但对于其他的对象,如nounsverbs,等等,log("log: " + obj + ", " + vocab[obj][word.toLowerCase()][0]);给出:

输出:Cannot read property '0' of undefined

我不明白那是怎么回事可能。如果我把'má' : ['Hemp', path+n+'Ma2_Hemp.mp3'],放在subjects的对象内,它可以正常工作......所以我认为循环有问题。

所以,如果我改变loglog("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 

所以它是从其他对象查找键,你可以看到它从Nouns返回Mother

代码:

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

你有扩展'Object.prototype'? –

+0

@cookiemonster这是做什么,我将如何扩展它? – Growler

+0

使每个对象都继承该属性。它可能以各种方式导致问题,例如枚举对象的属性时。你给'parseHoveredText()'的参数是什么? –

回答

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]; 
     } 
    } 
} 
+0

这解决了它。我知道循环有问题,但无法弄清楚发生了什么。非常感谢! – Growler

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/