2014-03-13 41 views
2

我在我的控制檯收到此錯誤:爲什麼我的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"]; 

每個陣列中只有一個值,現在,但隨着用戶增加工作會越來越大。在此之後我鏈接到一個文件,其中包含此功能(我評論了具體的線路),該類型錯誤是指:

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); 

} 

任何想法,爲什麼不能參考的價值?

+0

這是構建一個對象很奇怪的方式,爲什麼要創建一個數組,但從來沒有使用它作爲一個數組?它應該看起來更像這樣:'kbwork = {'2014':{kbid:46,kbsrc:'somethimg.png',...},'2013':{...},...} –

回答

2

我想你需要

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

因爲它看起來像gallery_year是一年值的2013,但關鍵是像2013.kbsrc

串聯字符串值沒有與您的結構的另一個問題,因爲kb_work[year]應該是一個obeject而不是一個數組,第二個級別的密鑰不一定再有一年。

因此該結構可以被更新,以

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

This給我'Uncaught TypeError:無法讀取未定義的屬性'kbsrc'仍然指向同一行,這是javascript文件中的函數 – JLF

+0

'gallery_year'的值是什麼? –

+0

哇,實現'gallery_year'是一個錯誤的價值!這解決了它!非常感謝!! – JLF

0

你嵌套顯示你想這樣的作品不同,以它如何工作?

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 

而且你可以在一年通包含字符串和0的變量可以是包含索引的變量。

您可以添加多行這樣的:

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

所以我會爲每年的每個組件添加多行,例如'2014':[{'kbid':[「46」]}],'2014':[{'kbsrc':[「images/src.jpg」]}]'然後如果我想訪問' kbsrc'我會寫'kb_work ['2014'] [1] .kbsrc [0]'? – JLF

+0

我已經添加了多行的示例。 – Fenton

相關問題