簡體   English   中英

訪問對象的隨機屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM