Ответ 1
Выбранный ответ будет хорошо работать. Однако этот ответ будет работать быстрее:
var randomProperty = function (obj) {
var keys = Object.keys(obj)
return obj[keys[ keys.length * Math.random() << 0]];
};
Предположим, что у вас есть объект 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;
}
}
}
Выбранный ответ будет хорошо работать. Однако этот ответ будет работать быстрее:
var randomProperty = function (obj) {
var keys = Object.keys(obj)
return obj[keys[ keys.length * Math.random() << 0]];
};
Выбор случайного элемента из потока
function pickRandomProperty(obj) {
var result;
var count = 0;
for (var prop in obj)
if (Math.random() < 1/++count)
result = prop;
return result;
}
Вы можете просто создать массив ключей при прохождении объекта.
var keys = [];
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
keys.push(prop);
}
}
Затем произвольно выберите элемент из ключей:
return keys[keys.length * Math.random() << 0];
Я не думал, что какой-либо из примеров достаточно сбивает с толку, поэтому здесь действительно трудно прочитать пример, делающий то же самое.
Изменить: вы, вероятно, не должны этого делать, если не хотите, чтобы ваши коллеги ненавидели вас.
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];
Если вы можете использовать библиотеки, вы можете обнаружить, что 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()
.
function getRandomArbitrary(min, max) {
return Math.floor(Math.random() * (max - min) + min);
}
var randNum = getRandomArbitrary(0, 7);
var index = randNum;
return Object.key(index); // Returns a random key
return Object.values(index); //Returns the corresponding value.
В объекте 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