Pick random property from a Javascript object

Suppose you have a Javascript object like:

{cat: 'meow', dog: 'woof', snake: 'hiss'}

Is there a more concise way to pick a random property from the object than this long winded way I came up with:

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;
}
}
}
102369 次浏览

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

var keys = [];
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
keys.push(prop);
}
}

然后,从键中随机选择一个元素:

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

从流中随机选取一个元素

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

所选择的答案会很有效,但这个答案会运行得更快:

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

如果您能够使用库,您可能会发现 洛达什 JS 库有许多非常有用的方法来解决这种情况。在这种情况下,继续检查 _.sample()

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

_.sample([1, 2, 3, 4]);
// → 2

在你的情况下,继续使用:

_.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)]]);

Explanation:

// 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];

如果你使用 下划线 js,你可以:

_.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”到“ min”的随机整数

function getRandomArbitrary(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}

然后,每次提供上述函数作为参数时,从 Javascript 对象中提取一个“键”或“值”或“两者”。

var randNum = getRandomArbitrary(0, 7);
var index = randNum;
return Object.key(index); // Returns a random key
return Object.values(index); //Returns the corresponding value.

You can use the following code to pick a random property from a JavaScript object:

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

这里有很多很棒的答案,所以让我来尝试传播按位 NOT (~)操作符的双故障变体的意识(我很确定我在 StackOverflow 上学到了这一点)。

通常,你会从1到10中随机选择一个数字,就像这样:

Math.floor(Math.random()*10) + 1

但是位操作意味着四舍五入得到更快的完成,所以下面的实现有可能显著提高性能,假设你已经做了足够多的这些操作:

~~(Math.random()*10) + 1