103 votes

Choisissez une propriété aléatoire à partir d'un objet Javascript

Supposons que vous ayez un objet Javascript tel que {'cat': 'meow', 'dog': 'woof' ...} Existe-t-il un moyen plus concis de choisir une propriété aléatoire de l'objet que ce chemin long que je viens de décrire? :

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

211voto

La réponse choisie ne fonctionne définitivement pas. Mais c'est le cas.

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

74voto

David Leonard Points 929

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

15voto

KennyTM Points 232647

Vous pouvez simplement construire un tableau de clés en parcourant l'objet.

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

puis choisissez au hasard un élément des clés.

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

15voto

Nitai J. Perez Points 1

Si vous êtes capable d’utiliser des bibliothèques, vous constaterez peut-être que la bibliothèque Lo-Dash JS dispose de nombreuses méthodes très utiles dans de tels cas. Dans ce cas, allez-y et vérifiez sample ().

(Remarque La convention Lo-Dash nomme l'objet de bibliothèque _. N'oubliez pas de vérifier l'installation dans la même page pour le 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"
 

1voto

Jeff Points 11

En réponse au commentaire de Cole Gleason sur la réponse du haut, inclinant à gauche, ceci se produit parce que Math.random () est appelé pour chaque élément du tableau. Depuis que random () est appelé à plusieurs reprises, il est plus probable qu'il se déclenche à chaque itération, de sorte qu'il ne va jamais très loin dans le tableau. Enregistrer "Math.random ()" avant de commencer la boucle devrait l’éclaircir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X