Предположим, у вас есть объект 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;
}
}
}
javascript
random
Бемму
источник
источник
Ответы:
Выбранный ответ подойдет. Однако этот ответ будет работать быстрее:
var randomProperty = function (obj) { var keys = Object.keys(obj); return obj[keys[ keys.length * Math.random() << 0]]; };
источник
Math.random()
возвращает число в диапазоне [0,1).Выбор случайного элемента из потока
function pickRandomProperty(obj) { var result; var count = 0; for (var prop in obj) if (Math.random() < 1/++count) result = prop; return result; }
источник
Я не думал, что какой-либо из примеров достаточно запутан, поэтому вот действительно трудный для чтения пример, делающий то же самое.
Изменить: вам, вероятно, не стоит этого делать, если вы не хотите, чтобы ваши коллеги ненавидели вас.
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)]]
Длинная рука, менее запутанная:
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];
источник
Вы можете просто создать массив ключей, проходя по объекту.
var keys = []; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { keys.push(prop); } }
Затем случайным образом выберите элемент из ключей:
return keys[keys.length * Math.random() << 0];
источник
var keys = Object.keys(obj)
<< 0
к целому числу ничего не даст.parseInt()
будет делать ту же работу. Так что здесь нечему учиться, кроме как писать менее понятный код.Если вы умеете использовать библиотеки, вы можете обнаружить, что библиотека Lo-Dash JS имеет множество очень полезных методов для таких случаев. В этом случае продолжайте и проверяйте
_.sample()
.(Обратите внимание, что соглашение Lo-Dash именует объект библиотеки _. Не забудьте проверить установку на той же странице, чтобы настроить ее для своего проекта.)
_.sample([1, 2, 3, 4]); // → 2
В вашем случае используйте:
_.sample({ cat: 'meow', dog: 'woof', mouse: 'squeak' }); // → "woof"
источник
Если вы используете 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);
источник
Другой простой способ сделать это - определить функцию, которая применяет
Math.random()
функцию.Эта функция возвращает случайное целое число в диапазоне от 'min'
function getRandomArbitrary(min, max) { return Math.floor(Math.random() * (max - min) + min); }
Затем извлекайте либо «ключ», либо «значение», либо «оба» из объекта Javascript каждый раз, когда вы предоставляете указанную выше функцию в качестве параметра.
var randNum = getRandomArbitrary(0, 7); var index = randNum; return Object.key(index); // Returns a random key return Object.values(index); //Returns the corresponding value.
источник
getRandomArbitrary
генерировал бы новое случайное число при каждом вызове.В объект JSON вы должны поместить это:
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; } }
Эта функция вернет внутреннюю часть случайного свойства.
источник
Вы можете использовать следующий код, чтобы выбрать случайное свойство из объекта 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
источник