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



답변

선택한 답변이 잘 작동합니다. 그러나이 답변은 더 빨리 실행됩니다.

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


답변

라이브러리를 사용할 수 있다면 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.