Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Javascript对象中拾取随机属性_Javascript_Random - Fatal编程技术网

从Javascript对象中拾取随机属性

从Javascript对象中拾取随机属性,javascript,random,Javascript,Random,假设您有一个Javascript对象,如{'cat':'meow','dog':'woof'…} 有没有比我想出的这个冗长的方法更简洁的方法从对象中选择随机属性: function pickRandomProperty(obj) { var prop, len = 0, randomPos, pos = 0; for (prop in obj) { if (obj.hasOwnProperty(prop)) { len += 1;

假设您有一个Javascript对象,如{'cat':'meow','dog':'woof'…} 有没有比我想出的这个冗长的方法更简洁的方法从对象中选择随机属性:

function pickRandomProperty(obj) {
    var prop, len = 0, randomPos, pos = 0;
    for (prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            len += 1;
        }
    }
    randomPos = Math.floor(Math.random() * len);
    for (prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            if (pos === randomPos) {
                return prop;
            }
            pos += 1;
        }
    }       
}

您只需在遍历对象时构建一个关键点数组

var keys = [];
for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        keys.push(prop);
    }
}
然后,从关键帧中随机拾取一个元素:

return keys[keys.length * Math.random() << 0];
返回键[keys.length*Math.random()

函数属性(obj){
var结果;
var计数=0;
用于(obj中的var prop)
if(Math.random()<1/++count)
结果=道具;
返回结果;
}

选择的答案会很好。但是,此答案会运行得更快:

var randomProperty = function (obj) {
    var keys = Object.keys(obj);
    return obj[keys[ keys.length * Math.random() << 0]];
};
var randomProperty=函数(obj){
var keys=Object.keys(obj);

返回obj[keys[keys.length*Math.random()如果您能够使用库,您可能会发现JS库中有很多非常有用的方法用于此类情况。在这种情况下,请继续检查
.sample()

(注意,Lo-Dash约定是命名库对象389;。 不要忘记在同一页面中检查安装,以便为您的项目进行设置。)

在您的情况下,请继续使用:

_.sample({
    cat: 'meow',
    dog: 'woof',
    mouse: 'squeak'
});
// → "woof"

我认为所有的例子都不够混乱,所以这里有一个很难读懂的例子做同样的事情

编辑:你可能不应该这样做,除非你想让你的同事讨厌你

var animals = {
    'cat': 'meow',
    'dog': 'woof',
    'cow': 'moo',
    'sheep': 'baaah',
    'bird': 'tweet'
};

// Random Key
console.log(Object.keys(animals)[Math.floor(Math.random()*Object.keys(animals).length)]);

// Random Value
console.log(animals[Object.keys(animals)[Math.floor(Math.random()*Object.keys(animals).length)]]);
说明:

// gets an array of keys in the animals object.
Object.keys(animals) 

// This is a number between 0 and the length of the number of keys in the animals object
Math.floor(Math.random()*Object.keys(animals).length)

// Thus this will return a random key
// Object.keys(animals)[0], Object.keys(animals)[1], etc
Object.keys(animals)[Math.floor(Math.random()*Object.keys(animals).length)]

// Then of course you can use the random key to get a random value
// animals['cat'], animals['dog'], animals['cow'], etc
animals[Object.keys(animals)[Math.floor(Math.random()*Object.keys(animals).length)]]
长话短说,不那么令人困惑:

var animalArray  = Object.keys(animals);
var randomNumber = Math.random();
var animalIndex  = Math.floor(randomNumber * animalArray.length);

var randomKey    = animalArray[animalIndex];
// This will course this will return the value of the randomKey
// instead of a fresh random value
var randomValue  = animals[randomKey]; 
如果您正在使用,您可以执行以下操作:

_.sample(Object.keys(animals));

额外:

如果需要多个随机属性,请添加一个数字:

_.sample(Object.keys(animals), 3);
如果需要仅具有这些随机特性的新对象:

const props = _.sample(Object.keys(animals), 3);
const newObject = _.pick(animals, (val, key) => props.indexOf(key) > -1);

另一种简单的方法是定义一个应用
Math.random()
函数的函数

此函数返回一个从“min”开始的随机整数 然后,每次将上述函数作为参数提供时,从Javascript对象中提取“key”或“value”或“两者”。
在JSON对象中,必须放置以下内容:
var对象={
“随机”:函数(){
var结果;
var计数=0;
for(本文件中的var prop){
if(Math.random()<1/++count&&prop!=“random”){
结果=这个[道具];
}
}
返回结果;
}

}
您可以使用以下代码从JavaScript对象中选择随机属性:

function randomobj(obj) {
var objkeys = Object.keys(obj)
return objkeys[Math.floor(Math.random() * objkeys.length)]
}
var example = {foo:"bar",hi:"hello"}
var randomval = example[randomobj(example)] // will return to value
// do something

ECMAScript标准是否说明属性总是以相同的顺序进行遍历?大多数实现中的对象都有稳定的顺序,但行为在规范中没有定义:这似乎偏向于对象中的第一个元素。我还不明白为什么!这永远不会选择第一个属性(Math.random始终小于1)在这之后,每个数字都有0.5次被选择的机会。因此,第二个属性有0.5次,第三个属性有0.25次,第四个属性有0.125次,等等。一些更正:这个函数可以选择第一个属性。在第一次迭代中,计数的前缀增量使方程的右侧计算为1/1==1。因为Math.random总是这样s在[0,1]范围内(0到1,不包括1),表达式的计算结果为true,并选择第一个属性。就随机选择的分布而言,它是一致的。一个属性有100%的几率被选中。两个属性有50%的几率被选中。三个属性有33.3%的几率被选中。依此类推。此解决方案的内存占用最小。@davidhad考虑到三个元素的序列,第一个元素的概率为1,但是第二个元素可能被替换为(1/2,我们不立即返回),第二个元素可能被第三个元素替换,概率为1/3,因此得到P(第一)=P(第一次选择)*p。(第二次未拾取)*P(第三次未拾取)=1*1/2*2/3=1/3;P(第二次)=P(第二次拾取)*P(第三次未拾取)=1/2*1/3;P(第三次)=P(第三次拾取)=1/3.Object.keys在这里很有用
var keys=Object.keys(obj)
Dang在这种情况下,位运算符的使用更可能是一种黑客行为,因为它需要一个整数作为输入,它可以转换数字。应用
这一点更好,因为它不使用循环。我做了一些测试,结果表明所选的答案很好,并且属性的选择是无偏的(与回答中的推测相反);但是,我在一个有170000个键的对象上进行了测试,这里的解决方案的速度大约是所选解决方案的两倍。这是jsperf对这个答案和所选答案进行了基准测试。对于较小的对象(100个属性),这个答案的性能要好3倍。较大的对象(100k属性)差值下降到2倍更好。@MuhammadUmer-No.
Math.random()
返回一个范围为[0,1]的数字。您是指Object.values(someObject)[index]?我用来存储生成的随机数的索引变量只是一个容器,没有什么特别的。如果我没有将生成的数存储到另一个变量中,那么函数的每个实例
getrandomural
每次调用时都会生成一个新的随机数。虽然此代码可以回答问题,但提供了关于如何和/或为什么解决问题的上下文将提高答案的长期价值。我最喜欢这个,包括解释和所有内容,还包括一个实际的例子POJO。好的答案,值得更多的投票!只是让一切都更容易理解!请注意,问题和答案实际上是在寻找答案指定随机对象属性的值,而不是问题标题所建议的随机属性。
const props = _.sample(Object.keys(animals), 3);
const newObject = _.pick(animals, (val, key) => props.indexOf(key) > -1);
function getRandomArbitrary(min, max) {
  return Math.floor(Math.random() * (max - min) + min);
}
var randNum = getRandomArbitrary(0, 7);
var index = randNum;
return Object.key(index); // Returns a random key
return Object.values(index); //Returns the corresponding value.
function randomobj(obj) {
var objkeys = Object.keys(obj)
return objkeys[Math.floor(Math.random() * objkeys.length)]
}
var example = {foo:"bar",hi:"hello"}
var randomval = example[randomobj(example)] // will return to value
// do something