从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);