将所选的随机属性连接到对象以获取数组?

时间:2015-08-31 06:36:21

标签: javascript

我有一个包含几个数组的对象。我试图随机返回其中一个数组。我有一个函数返回对象中的一个属性,但我不知道如何将它连接到对象名称时使用它。例如:

对象:

var myObj = {
    itemOne:['blue','red','green'],
    itemTwo:['sky','grass','book'],
    itemThree:['day','month','year']
} 

要获得某个数组,我会myObj.itemOne返回第一个数组。但我想随机返回一个数组。我有一个随机返回itemOneitemTwoitemThree的函数,但在连接函数返回myObj.时,它不起作用。我能做什么。这是功能:

function pickRandomProperty(myObj) {
    var result;
    var count = 0;
    for (var prop in myObj){
        if (Math.random() < 1/++count){
           result = prop;
        }
    }
    return result;
}

var getItemInObject = pickRandomProperty(myObj);

使用getItemInObject返回的内容,我尝试将其与myObj连接以返回数组。我该怎么办?这是我尝试过的:

var getItemInObject = pickRandomProperty(myObj);
var randProp = myObj.getItemInObject;

甚至:

var randWord = myObj + '.' + getItemInObject;

返回&#39; [object Object] .itemTwo&#39;

这是一个小提琴:http://jsfiddle.net/xrk7b4zs/

感谢您的帮助

6 个答案:

答案 0 :(得分:1)

您使用括号表示法:

var getItemInObject = pickRandomProperty(myObj);
var randProp = myObj[getItemInObject];
//                  ^               ^

在JavaScript中,您可以使用点表示法和属性名称​​ literal obj.foo)或括号表示法和属性名称​​ string 来引用属性(obj["foo"])(或ES6 +中的Symbol,但这里不相关)。在第二种情况下,字符串可以是任何表达式的结果,包括变量引用。

直播示例:

&#13;
&#13;
var myObj = {
    itemOne:['blue','red','green'],
    itemTwo:['sky','grass','book'],
    itemThree:['day','month','year']
} 

function pickRandomProperty(myObj) {
    var result;
    var count = 0;
    for (var prop in myObj){
        if (Math.random() < 1/++count){
           result = prop;
        }
    }
    return result;
}

var getItemInObject = pickRandomProperty(myObj);
var array = myObj[getItemInObject];
document.body.insertAdjacentHTML(
  "beforeend",
  "<pre>" + JSON.stringify(array) + "</pre>"
);
&#13;
&#13;
&#13;

旁注:假设您只关心对象&#34;拥有&#34;这是一种更容易选择随机属性的方法。属性(不是原型中的属性):

function pickRandomProperty(myObj) {
    var keys = Object.keys(myObj);
    return keys[Math.floor(Math.random() * keys.length)];
}

直播示例:

&#13;
&#13;
var myObj = {
    itemOne:['blue','red','green'],
    itemTwo:['sky','grass','book'],
    itemThree:['day','month','year']
} 

function pickRandomProperty(myObj) {
    var keys = Object.keys(myObj);
    return keys[Math.floor(Math.random() * keys.length)];
}

var getItemInObject = pickRandomProperty(myObj);
var array = myObj[getItemInObject];
document.body.insertAdjacentHTML(
  "beforeend",
  "<pre>" + JSON.stringify(array) + "</pre>"
);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以连接字符串,而不是代码。要从变量访问对象属性,请使用括号表示法:

var randWord = myObj[getItemInObject];

http://jsfiddle.net/xrk7b4zs/2/

但是,即使这段代码只返回对象属性,这是一个字符串数组,并且根据您的变量名称判断,您可能希望从该数组中选择一个随机字符串。

注意:如果由于某种原因你 使用点表示法,你可以使用eval评估连续字符串,但不建议在+ 99%例。

答案 2 :(得分:1)

var getItemInObject = pickRandomProperty(myObj);
console.log(getItemInObject)
var randWord = myObj[getItemInObject];

你需要做myObj [getItemInObject];

Upadated Fiddle

答案 3 :(得分:0)

您可以使用eval将字符串评估为javascript代码:

var randWord = eval('myObj.' + getItemInObject);

Working Fiddle

答案 4 :(得分:0)

您可以通过双向实现对象属性

  1. 使用“。”运算符和2.在[“”]中使用传递键字符串。
  2. 您在此处的代码中使用了:

    var myObj = {
    itemOne:['blue','red','green'],
    itemTwo:['sky','grass','book'],
    itemThree:['day','month','year']
    } 
    

    您可以通过两种方式获取对象属性值

    1. myObj.itemOne // this way you used when you know what value you want to return.
    
    2. myObj["itemOne"] // this way you will used when you want to access you object Property in generic Way. i recommend you to use this way.
    

    在您的代码中:

    var getItemInObject = pickRandomProperty(myObj); 这个变量包含你的 object.property名称,你可以通过运行函数返回。

    var getItemInObject = pickRandomProperty(myObj);
    

    所以你可以传递这个变量Like This来随机访问你的对象属性值

    var randWord = myObj[getItemInObject];
    console.log(randWord);
    

    我希望这个答案可以帮助你实现你想要的目标。它会给你带来像。:

    enter image description here

答案 5 :(得分:0)

var myObj = {
    itemOne:['blue','red','green'],
    itemTwo:['sky','grass','book'],
    itemThree:['day','month','year']
} 

function pickRandomProperty(myObj) {
   var result;
   var rKey = Math.floor((Math.random()*3)+1) -1;
   return myObj.itemOne[rKey];
}

var getItemInObject = pickRandomProperty(myObj);
var randWord = 'myObj.itemOne' + '.' + getItemInObject;

 console.log(randWord);

它有效!!!