为什么我的JavaScript对象抛出一个未定义的错误



我在控制台得到这个错误:

Uncaught TypeError: Cannot read property 'kbsrc' of undefined

我得到这个错误,因为我认为有可能是错误的方式,我创建我的JavaScript对象。我从来没有创建过像这个这样多维的对象,所以我可能在某个地方搞砸了语法。我在这里的标记文件中生成对象:

var kb_work = {}
    kb_work['2014'] = {};
        kb_work['2014']['kbid'] = ["51","47"];
        kb_work['2014']['kbsrc'] = ["images/images-4.jpeg","images/imgres-3.jpeg"];
        kb_work['2014']['kbtitle'] = ["shalom","Test 6"];
        kb_work['2014']['kbmedium'] = ["2x2","Oil"];
        kb_work['2014']['kbsize'] = ["2x2","2x6"];
        kb_work['2014']['kbdate'] = ["2014","2014"];
    kb_work['2013'] = {};
        kb_work['2013']['kbid'] = ["55","54","53","52","50"];
        kb_work['2013']['kbsrc'] = ["images/imgres-4.jpeg","images/imgres-3.jpeg","images/imgres-1.jpeg","images/images.jpeg","images/images-3.jpeg"];
        kb_work['2013']['kbtitle'] = ["totally","heheh","Howdy","tickle","hi"];
        kb_work['2013']['kbmedium'] = ["oil","oil","2x2","o","oil"];
        kb_work['2013']['kbsize'] = ["2x2","2x2","2x2","2x2","2x1"];
        kb_work['2013']['kbdate'] = ["2013","2013","2013","2013","2013"];
    kb_work['2012'] = {};
        kb_work['2012']['kbid'] = ["49"];
        kb_work['2012']['kbsrc'] = ["images/images-2.jpeg"];
        kb_work['2012']['kbtitle'] = ["chicked"];
        kb_work['2012']['kbmedium'] = ["oil"];
        kb_work['2012']['kbsize'] = ["3x4"];
        kb_work['2012']['kbdate'] = ["2012"];

这些数组现在只有一个值,但是会随着用户的增加而增加。在此之后,我链接到一个文件,其中包含TypeError引用的函数(我在特定行上注释了):

function changeGal(gallery_year) {
  $("#gallery-control-bar").fadeOut(t);
  $("#gallery-image").fadeOut(t);
  $("#info").fadeOut(t);
  $("#gallery-viewer").fadeOut(t);
  //this is where the script chokes up referring to "currentImg" which is 0 and refers to the first value in the array "['2014']['kbsrc']".
    $("#gallery-image").html("<img src='" + kb_work[gallery_year]['kbsrc'][currentImg] + "'>");
    $("#gallery-title").html(kb_work[gallery_year]['kbtitle'][currentImg]);
    $("#gallery-medium").html(kb_work[gallery_year]['kbmedium'][currentImg]);
    $("#gallery-size").html(kb_work[gallery_year]['kbsize'][currentImg]);
    $("#gallery-date").html(kb_work[gallery_year]['kbdate'][currentImg]);
  $("#gallery-control-bar").delay(t + d).fadeIn(t);
  $("#gallery-image").delay(t + d).fadeIn(t);
  $("#info").delay(t + d).fadeIn(t);
  var userCurrent = currentImg + 1;
  var userTotal = kb_work[gallery_year][0].length;
  $("#current-post").html(userCurrent);
  $("#post-total").html(userTotal);
  var galWidth = $("#gallery-image" > "img").width();
  $("#gallery").width(galWidth);
}

对于为什么不能引用值有什么想法吗?

我认为你需要

$("#gallery-image").html("<img src='" + kb_work[gallery_year][gallery_year + '.kbsrc'][currentImg] + "'>");

,因为看起来gallery_year是一个年份值,比如2013,但键是一个连接字符串值,比如2013.kbsrc

还有一个问题,你的结构,因为kb_work[year]应该是一个对象,而不是一个数组,再次键的第二级不需要有年份。

所以结构可以更新为

var kb_work = {}
kb_work['2014'] = {};
kb_work['2014']['kbid'] = ["46"];
kb_work['2014']['kbsrc'] = ["images/screen shot 2014-03-05 at 11.31.04 pm.png"];
kb_work['2014']['kbtitle'] = ["Test 5"];
kb_work['2014']['kbmedium'] = ["Oil"];
kb_work['2014']['kbsize'] = ["2x5"];
kb_work['2014']['kbdate'] = ["2014"];
kb_work['2013'] = {};
kb_work['2013']['kbid'] = ["44"];
kb_work['2013']['kbsrc'] = ["images/screen shot 2014-03-05 at 11.31.04 pm.png"];
kb_work['2013']['kbtitle'] = ["Test 3"];
kb_work['2013']['kbmedium'] = ["Oil"];
kb_work['2013']['kbsize'] = ["2x1"];
kb_work['2013']['kbdate'] = ["2013"];
kb_work['2012'] = {};
kb_work['2012']['kbid'] = ["45"];
kb_work['2012']['kbsrc'] = ["images/screen shot 2014-03-05 at 11.31.04 pm.png"];
kb_work['2012']['kbtitle'] = ["Test 4"];
kb_work['2012']['kbmedium'] = ["Oil"];
kb_work['2012']['kbsize'] = ["2x3"];
kb_work['2012']['kbdate'] = ["2012"];

然后访问它

kb_work[gallery_year]['kbsrc'][currentImg]

您的嵌套表明您认为这与实际工作方式不同…

var kb_work = {}
    kb_work['2014'] = new Array();
        kb_work['2014.kbid'] = ["46"];

实际结果是这样的对象:{"2014":[],"2014.kbid":["46"]}

我相信你想要这个:

var kb_work = {
    '2014': [
        { 'kbid': ["46"] }
     ]
};

结果是这样的对象:{"2014":[{"kbid":["46"]}]}

现在可以访问:

kb_work['2014'][0].kbid[0] // 46

您可以将year作为包含字符串的变量传入,而0 s可以作为包含索引的变量传入。

你可以像这样添加多行:

var kb_work = {
    '2014': [
        { 'kbid': ["46"] },
        { 'kbid': ["62"] },
        { 'kbid': ["90"] }
     ]
};

相关内容

  • 没有找到相关文章

最新更新