Выберите случайное свойство из объекта Javascript

Предположим, что у вас есть объект 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;
        }
    }       
}

Ответ 1

Выбранный ответ будет хорошо работать. Однако этот ответ будет работать быстрее:

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

Ответ 3

Вы можете просто создать массив ключей при прохождении объекта.

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

Затем произвольно выберите элемент из ключей:

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

Ответ 4

Я не думал, что какой-либо из примеров достаточно сбивает с толку, поэтому здесь действительно трудно прочитать пример, делающий то же самое.

Изменить: вы, вероятно, не должны этого делать, если не хотите, чтобы ваши коллеги ненавидели вас.

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

Ответ 5

Если вы можете использовать библиотеки, вы можете обнаружить, что Lo-Dash В JS-библиотеке есть много очень полезных методов для таких случаев. В этом случае перейдите и проверьте _.sample().

(Примечание. Соглашение Lo-Dash называет библиотечный объект _. Не забудьте проверить установку на той же странице, чтобы настроить его для своего проекта.)

_.sample([1, 2, 3, 4]);
// → 2

В вашем случае, продолжайте и используйте:

_.sample({
    cat: 'meow',
    dog: 'woof',
    mouse: 'squeak'
});
// → "woof"

Ответ 6

Если вы используете 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);

Ответ 7

Другим простым способом сделать это будет определение функции, которая применяет функцию 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.

Ответ 8

В объекте 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;
  }
}

Ответ 9

Вы можете использовать следующий код, чтобы выбрать случайное свойство из объекта 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