Javascript 访问对象的随机属性
我有一个巨大的物体,里面有整个ESV圣经。每当我按下一个按钮,我就想随机得到一本圣经。这是该对象的一个小示例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
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]