Suponga que tiene un objeto Javascript como {'gato': 'miau', 'perro': 'guau' ...} ¿Hay una forma más concisa de elegir una propiedad aleatoria del objeto que esta forma larga y prolija que se me ocurrió? :
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
fuente
fuente
Respuestas:
La respuesta elegida funcionará bien. Sin embargo, esta respuesta se ejecutará más rápido:
var randomProperty = function (obj) { var keys = Object.keys(obj); return obj[keys[ keys.length * Math.random() << 0]]; };
fuente
Math.random()
devuelve un número en el rango [0,1).Elegir un elemento aleatorio de una secuencia
function pickRandomProperty(obj) { var result; var count = 0; for (var prop in obj) if (Math.random() < 1/++count) result = prop; return result; }
fuente
No pensé que ninguno de los ejemplos fuera lo suficientemente confuso, así que aquí hay un ejemplo realmente difícil de leer que hace lo mismo.
Editar: probablemente no deberías hacer esto a menos que quieras que tus compañeros de trabajo te odien.
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)]]);
Explicación:
// 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)]]
Mano larga, menos confusa:
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];
fuente
Puede simplemente construir una matriz de claves mientras camina por el objeto.
var keys = []; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { keys.push(prop); } }
Luego, elija al azar un elemento de las claves:
return keys[keys.length * Math.random() << 0];
fuente
var keys = Object.keys(obj)
<< 0
a un número entero no hará nada.parseInt()
hará el mismo trabajo. Así que no hay nada que aprender aquí excepto escribir un código menos comprensible.Si es capaz de utilizar bibliotecas, es posible que encuentre que la biblioteca Lo-Dash JS tiene muchos métodos muy útiles para tales casos. En este caso, continúe y verifique
_.sample()
.(Tenga en cuenta que la convención de Lo-Dash es nombrar el objeto de la biblioteca _. No olvide verificar la instalación en la misma página para configurarla para su proyecto).
_.sample([1, 2, 3, 4]); // → 2
En su caso, siga adelante y utilice:
_.sample({ cat: 'meow', dog: 'woof', mouse: 'squeak' }); // → "woof"
fuente
Si está utilizando underscore.js , puede hacer lo siguiente:
_.sample(Object.keys(animals));
Extra:
Si necesita varias propiedades aleatorias, agregue un número:
_.sample(Object.keys(animals), 3);
Si necesita un nuevo objeto con solo esas propiedades aleatorias:
const props = _.sample(Object.keys(animals), 3); const newObject = _.pick(animals, (val, key) => props.indexOf(key) > -1);
fuente
Otra forma sencilla de hacer esto sería definir una función que se aplique
Math.random()
función.Esta función devuelve un número entero aleatorio que va desde el 'min'
function getRandomArbitrary(min, max) { return Math.floor(Math.random() * (max - min) + min); }
Luego, extraiga una 'clave' o un 'valor' o 'ambos' de su objeto Javascript cada vez que proporcione la función anterior como parámetro.
var randNum = getRandomArbitrary(0, 7); var index = randNum; return Object.key(index); // Returns a random key return Object.values(index); //Returns the corresponding value.
fuente
getRandomArbitrary
generaría un nuevo número aleatorio cada vez que se llama.En un objeto JSON debes colocar esto:
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; } }
Esa función devolverá el interior de una propiedad aleatoria.
fuente
Puede utilizar el siguiente código para elegir una propiedad aleatoria de un objeto 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
fuente