Javascript 访问对象的随机属性

Javascript 访问对象的随机属性,javascript,arrays,random,Javascript,Arrays,Random,我有一个巨大的物体,里面有整个ESV圣经。每当我按下一个按钮,我就想随机得到一本圣经。这是该对象的一个小示例 var esvObject = { "Genesis": { "1": {} "2": {} "3": {} }, "Exodus": { "1": {} "2": {} "3": {} } } 这是我用来获取随机书籍的代码 var randNum = Math.floor(Math.random() * 66

我有一个巨大的物体,里面有整个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;
我希望这是可行的,但我总是得到的输出是“未定义的”,我希望输出是“创世记”或“出埃及记”等。得到随机数是可行的,但如果

randNum = 1
然后


输出返回为“未定义”,我不知道为什么。

您正在生成随机数。然后试着用这个数字来挑选房子

但是你的物体有属性“起源”和“出埃及记”,而不是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)]]

您未定义的原因是您的对象属于以下结构:

let esvObject = {
   bookName: {
      1 : {}
   }
}
在javascript对象上使用括号
[]
符号查找名称的匹配键并返回其值。在顶级对象(键为
bookNames
的对象)中,必须使用有效的图书名称,如
Genesis
。为此,利用javascript函数获取对象中所有键的数组

然后可以使用
[]
表示法,该表示法在数组上具有不同的语义

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
您将访问数组与访问对象混淆了

数组:

arr = ["genesis", "exodus"]
是这样访问的:

arr[0] // genesis
obj["genesis"] // foo
对象:

obj = { "genesis" : "foo", "exodus" : "bar"}
是这样访问的:

arr[0] // genesis
obj["genesis"] // foo

要实现您想要做的事情,请参见

您希望esvObject[1]返回什么
esvObject
不包含键
1
,是吗?我希望它返回“Exodus”。在对象中,0是“Genesis”,1是“Exodus”。OP消失了……我不确定,但我想我以前试过,结果是[object object]@Caleb。好吧,这将返回一个对象。如果将其转换为字符串,则会得到
[object object]
。这并不奇怪。如果您只想要书的名称,请使用
Object.keys(esvObjects)[Math.floor(Math.random()*66)]
书的名称将作为字符串输出,对吗?因此,如果我将一个变量分配给
esvObject[Object.keys(esvObjects)[Math.floor(Math.random()*66)]
,它将作为字符串输出,对吗?不,
Object.keys(esvObjects)[Math.floor(Math.random()*66)]
给您一个字符串。对象的一个键,即一本书的名称。如果使用该字符串访问
esvObject
,则将获得分配给该属性的任何内容。在您的例子中,
{“1”:{}“2”:{}“3”:{}}
(注意,您遗漏了逗号)我这样做了
randBook=esvObject[Object.keys(esvObject)[Math.floor(Math.random()*66)]
,输出是[Object-Object]