从Javascript对象中select随机属性

假设你有一个Javascript对象,如{'cat':'meow','dog':'woof'…}有没有一个更简洁的方法从对象中select一个随机属性, :

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; } } } 

从stream中挑选一个随机元素

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

您可以在遍历对象的同时构build一组键。

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

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

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

如果你有能力使用库,你可能会发现Lo-Dash 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)]]); 

说明:

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

长手,less混乱:

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

如果你使用的是underscore.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);