访问对象的随机属性

时间:2019-01-30 12:25:37

标签: javascript arrays random

我有一个巨大的物体,里面装有整本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”,我不知道为什么。

5 个答案:

答案 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?

相关问题