无法读取对象对象的未定义属性“0”

时间:2014-02-08 22:36:56

标签: javascript object logging

我有一个包含数组的对象。我想循环使用它们。对于subjects中的vocab对象,parseHoveredText()的log("log: " + obj + ", " + vocab[obj][word.toLowerCase()][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对象中,它可以正常工作......所以我认为循环有问题。

因此,如果我将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];
    }
}

2 个答案:

答案 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/