[英]Accessing Random Property of Object
我有一個巨大的物件,其中包含整個ESV聖經。 每當我按下按鈕時,我都會嘗試隨機獲取一本聖經。 這是該對象的一小部分樣本。
var esvObject = {
"Genesis": {
"1": {}
"2": {}
"3": {}
},
"Exodus": {
"1": {}
"2": {}
"3": {}
}
}
這是我用來獲取隨機書籍的代碼。
var randNum = Math.floor(Math.random() * 66);
var randBook = esvObject[randNum];
var output = randBook;
我希望這可以工作,但是我總是得到的輸出是“ undefined”,在這里我希望輸出是“ Genesis”或“ Exodus”等。獲取隨機數是可行的,但是如果
randNum = 1
然后
randBook = esvObject[1]
輸出返回為“未定義”,我不知道為什么。
嗯,您之所以未定義,是因為您的對象具有以下結構:
let esvObject = {
bookName: {
1 : {}
}
}
在javascript對象上使用方括號[]
表示法可找到名稱的匹配鍵,並返回其值。 在頂層對象(帶有bookNames
作為鍵的對象)中,您必須使用有效的書名,例如Genesis
。 為此,請利用javascript的Object.keys函數獲取對象中所有鍵的數組。
然后,您可以使用[]
表示法,該表示法在數組上具有不同的語義。
let books = Object.keys(esvObject); // ["Genesis", "Exodus", ...]
let randomKey = books[randNum] // this is an array, so index access works
let book = esvObject[randomKey] // matches on the bookname
為了將它們綁在一起, esvObject["Genesis"][1]
將是有效的,因為存儲為“ Genesis”的對象具有屬性1
您正在生成隨機數。 然后嘗試使用該數字選擇屬性。
但是您的對象具有Genesis和Exodus屬性,而不是1或20等。您需要做的是Object.getOwnPropertyNames(esvObject)
,它將為您提供屬性名稱數組。 在這種情況下,['Genesis','Exodus'],然后您需要從該數組中選擇隨機元素
它不起作用,因為它不知道第一本書被命名為“ Genesis”。 為了能夠使用隨機函數中的數字,您將需要使用對象鍵中的數組
var keys = esvObject.keys( obj );
randBookKey = keys[randNum]
randBook = esvObject[randBookKey]
esvObject
(如您所示)沒有任何整數鍵。 因此,您需要選擇一個隨機(現有)密鑰:
esvObject[Object.keys(esvObjects)[Math.floor(Math.random() * 66)]]
您將訪問數組與訪問對象混淆了。
數組:
arr = ["genesis", "exodus"]
這樣訪問:
arr[0] // genesis
一個東西:
obj = { "genesis" : "foo", "exodus" : "bar"}
這樣訪問:
obj["genesis"] // foo
要實現您要執行的操作,請參閱按索引訪問非數字對象屬性?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.