Supposons que vous ayez un objet Javascript comme {'cat': 'meow', 'dog': 'woof' ...} Y a-t-il un moyen plus concis de choisir une propriété aléatoire de l'objet que cette longue méthode que j'ai trouvée :
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;
}
}
}
javascript
random
Bemmu
la source
la source
Réponses:
La réponse choisie fonctionnera bien. Cependant, cette réponse fonctionnera plus rapidement:
var randomProperty = function (obj) { var keys = Object.keys(obj); return obj[keys[ keys.length * Math.random() << 0]]; };
la source
Math.random()
renvoie un nombre compris entre [0,1).Choisir un élément aléatoire dans un flux
function pickRandomProperty(obj) { var result; var count = 0; for (var prop in obj) if (Math.random() < 1/++count) result = prop; return result; }
la source
Je ne pensais pas qu'aucun des exemples était assez déroutant, alors voici un exemple vraiment difficile à lire faisant la même chose.
Edit: Vous ne devriez probablement pas faire cela à moins que vous ne vouliez que vos collègues vous détestent.
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)]]);
Explication:
// 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)]]
Main longue, moins déroutante:
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];
la source
Vous pouvez simplement créer un tableau de clés tout en parcourant l'objet.
var keys = []; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { keys.push(prop); } }
Ensuite, choisissez au hasard un élément parmi les clés:
return keys[keys.length * Math.random() << 0];
la source
var keys = Object.keys(obj)
<< 0
à un entier ne fera rien.parseInt()
fera le même travail. Donc rien à apprendre ici si ce n'est d'écrire du code moins compréhensible.Si vous êtes capable d'utiliser des bibliothèques, vous constaterez peut-être que la bibliothèque Lo-Dash JS a beaucoup de méthodes très utiles pour de tels cas. Dans ce cas, allez-y et vérifiez
_.sample()
.(Notez que la convention Lo-Dash nomme l'objet de bibliothèque _. N'oubliez pas de vérifier l'installation dans la même page pour la configurer pour votre projet.)
_.sample([1, 2, 3, 4]); // → 2
Dans votre cas, allez-y et utilisez:
_.sample({ cat: 'meow', dog: 'woof', mouse: 'squeak' }); // → "woof"
la source
Si vous utilisez underscore.js, vous pouvez faire:
_.sample(Object.keys(animals));
Supplémentaire:
Si vous avez besoin de plusieurs propriétés aléatoires, ajoutez un nombre:
_.sample(Object.keys(animals), 3);
Si vous avez besoin d'un nouvel objet avec uniquement ces propriétés aléatoires:
const props = _.sample(Object.keys(animals), 3); const newObject = _.pick(animals, (val, key) => props.indexOf(key) > -1);
la source
Une autre façon simple de le faire serait de définir une fonction qui s'applique
Math.random()
fonction.Cette fonction renvoie un entier aléatoire qui va du 'min'
function getRandomArbitrary(min, max) { return Math.floor(Math.random() * (max - min) + min); }
Ensuite, extrayez une «clé» ou une «valeur» ou «les deux» de votre objet Javascript à chaque fois que vous fournissez la fonction ci-dessus comme paramètre.
var randNum = getRandomArbitrary(0, 7); var index = randNum; return Object.key(index); // Returns a random key return Object.values(index); //Returns the corresponding value.
la source
getRandomArbitrary
générerait un nouveau nombre aléatoire à chaque fois qu'elle est appelée.Dans un objet JSON, vous devez placer ceci:
var object={ "Random": function() { var result; var count = 0; for (var prop in this){ if (Math.random() < 1 / ++count&&prop!="Random"){ result = this[prop]; } } return result; } }
Cette fonction renverra l'intérieur d'une propriété aléatoire.
la source
Vous pouvez utiliser le code suivant pour sélectionner une propriété aléatoire à partir d'un objet 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
la source