假设你有一个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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 151
选择的答案将运作良好.但是,这个答案会更快:
var randomProperty = function (obj) {
var keys = Object.keys(obj)
return obj[keys[ keys.length * Math.random() << 0]];
};
Run Code Online (Sandbox Code Playgroud)
Dav*_*ard 74
function pickRandomProperty(obj) {
var result;
var count = 0;
for (var prop in obj)
if (Math.random() < 1/++count)
result = prop;
return result;
}
Run Code Online (Sandbox Code Playgroud)
ken*_*ytm 15
您可以在遍历对象时构建一个键数组.
var keys = [];
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
keys.push(prop);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,从键中随机选择一个元素:
return keys[keys.length * Math.random() << 0];
Run Code Online (Sandbox Code Playgroud)
Pau*_*l J 14
我没想到任何一个例子都让人感到困惑,所以这里有一个很难读的例子做同样的事情.
编辑:你可能不应该这样做,除非你希望你的同事恨你.
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)]]);
Run Code Online (Sandbox Code Playgroud)
说明:
// 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)]]
Run Code Online (Sandbox Code Playgroud)
长手,不那么困惑:
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];
Run Code Online (Sandbox Code Playgroud)
Sel*_*ish 12
如果您能够使用库,您可能会发现Lo-Dash JS库对于这种情况有很多非常有用的方法.在这种情况下,请继续检查_.sample()
.
(注意Lo-Dash约定是命名库对象_.不要忘记在同一页面中检查安装以为项目设置它.)
_.sample([1, 2, 3, 4]);
// ? 2
Run Code Online (Sandbox Code Playgroud)
在您的情况下,继续使用:
_.sample({
cat: 'meow',
dog: 'woof',
mouse: 'squeak'
});
// ? "woof"
Run Code Online (Sandbox Code Playgroud)
如果你使用underscore.js你可以这样做:
_.sample(Object.keys(animals));
Run Code Online (Sandbox Code Playgroud)
额外的:
如果您需要多个随机属性,请添加一个数字:
_.sample(Object.keys(animals), 3);
Run Code Online (Sandbox Code Playgroud)
如果您需要一个仅具有这些随机属性的新对象:
const props = _.sample(Object.keys(animals), 3);
const newObject = _.pick(animals, (val, key) => props.indexOf(key) > -1);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
57883 次 |
最近记录: |