我有一个巨大的物体,里面装有整本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]
输出返回为“ undefined”,我不知道为什么。
答案 0 :(得分: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
答案 1 :(得分:0)
您正在生成随机数。然后尝试使用该数字选择属性。
但是您的对象具有Genesis和Exodus属性,而不是1或20等。
您需要做的是data want ;
merge have havenot(in=in2 keep=party_id preference_id);
by party_id preference_id;
if not in2;
run;
这将为您提供属性名称数组。在这种情况下['Genesis','Exodus'],然后您需要从该数组中选择随机元素
答案 2 :(得分:0)
它不起作用,因为它不知道第一本书被命名为“ Genesis”。 为了能够使用随机函数中的数字,您将需要使用对象键中的数组
var keys = esvObject.keys( obj );
randBookKey = keys[randNum]
randBook = esvObject[randBookKey]
答案 3 :(得分:0)
esvObject
(如您所显示的)没有任何整数键。因此,您需要选择一个随机(现有)密钥:
esvObject[Object.keys(esvObjects)[Math.floor(Math.random() * 66)]]
答案 4 :(得分:0)
您将访问数组与访问对象混淆了。
一个数组:
tf_x = tf.convert_to_tensor(x, dtype=np.float32)
loss = tf.keras.losses.binary_crossentropy(tf_y, model2(tf_x))
grad, = K.gradients(loss, tf_x)
像这样访问:
arr = ["genesis", "exodus"]
一个对象:
arr[0] // genesis
像这样访问:
obj = { "genesis" : "foo", "exodus" : "bar"}
要实现您想做的事情,请参见Access non-numeric Object properties by index?