जावास्क्रिप्ट ऑब्जेक्ट से यादृच्छिक संपत्ति चुनें


88

मान लीजिए कि आपके पास {: कैट ’: 'म्याऊ’, have डॉग ’: o वूफ’… जैसी जावास्क्रिप्ट ऑब्जेक्ट है ... क्या इस लंबे घुमावदार रास्ते की तुलना में ऑब्जेक्ट से रैंडम प्रॉपर्टी लेने के लिए और अधिक संक्षिप्त तरीका है, जिसके साथ मैं आया था। :

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

ओपी, कृपया अपना चयनित उत्तर पुनः चुनें ... @kennytm ने दूसरों के समक्ष इसका सही उत्तर दिया। डेविड का जवाब बस खराब कोडिंग है (हालांकि यह काम करता है)
— vsync

ध्यान दें कि प्रश्न और उत्तर वास्तव में एक यादृच्छिक वस्तु संपत्ति के मूल्य को लौटाने के लिए देखते हैं, न कि एक यादृच्छिक संपत्ति के रूप में प्रश्न शीर्षक का सुझाव देगा।
— Kontur

जवाबों:


181

चुना हुआ उत्तर अच्छी तरह से काम करेगा। हालाँकि, यह उत्तर तेजी से चलेगा:

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

3
यह बेहतर है क्योंकि यह लूप का उपयोग नहीं करता है
— डोमिनिक

13
मैंने कुछ परीक्षण किए, और ऐसा प्रतीत होता है कि चुना हुआ उत्तर ठीक काम करता है और यह कि संपत्ति का चुनाव निष्पक्ष है (प्रतिक्रियाओं के बीच अटकलों के विपरीत); हालाँकि, मैंने 170,000 कुंजियों वाली एक वस्तु का परीक्षण किया और यहाँ का समाधान चुने हुए समाधान के मुकाबले लगभग दोगुना था।
— ड्रैगनफली

8
क्या << 0 (बाईं ओर से बिटशिफ्ट)) Math.round () लिखने का एक शॉर्टहैंड तरीका है?
— SystemicPlural

4
यह jsperf jsperf.com/random-object-property-selection बेंचमार्क इस उत्तर और चुने हुए उत्तर को दर्शाता है । यह उत्तर छोटी वस्तुओं (100 गुण) के लिए 3x से बेहतर प्रदर्शन करता है। बड़ी वस्तुओं (100k गुण) का अंतर 2x बेहतर हो जाता है।
— कॉन्स्टेबलब्रेव

2
@MuhammadUmer - नंबर Math.random()[0,1) श्रेणी में एक नंबर देता है।
— Yay295

74

एक धारा से एक यादृच्छिक तत्व चुनना

function pickRandomProperty(obj) {
    var result;
    var count = 0;
    for (var prop in obj)
        if (Math.random() < 1/++count)
           result = prop;
    return result;
}

2
क्या ECMAScript मानक गुणों के बारे में कुछ भी कहता है जो हमेशा एक ही क्रम में होता है? अधिकांश कार्यान्वयन में वस्तुओं का स्थिर क्रम होता है, लेकिन व्यवहार कल्पना में अपरिभाषित है: stackoverflow.com/questions/280713/…
— ब्रेंडन बर्ग

4
यह वस्तु में पहले तत्व की ओर तिरछा लगता है। मुझे पता नहीं क्यों अभी तक है!
— कोल ग्लीसन

7
यह पहली संपत्ति का चयन कभी नहीं करेगा (Math.random हमेशा <1 है) और उसके बाद प्रत्येक नंबर के लिए चयनित होने का 0.5 मौका होगा। तो दूसरी संपत्ति के लिए 0.5, तीसरी के लिए 0.25, 4 के लिए 0.125 आदि
— सिस्टमिकलुरल

4
कुछ सुधार: यह फ़ंक्शन पहली संपत्ति का चयन कर सकता है। पहली पुनरावृत्ति पर, गिनती पर उपसर्ग वृद्धि, समीकरण के दाहिने हाथ को 1/1 == के मूल्यांकन का पक्ष बनाती है। 1. चूंकि Math.random हमेशा सीमा में होता है [0,1) (शून्य से एक तक, एक को छोड़कर), अभिव्यक्ति सत्य का मूल्यांकन करती है और पहली संपत्ति का चयन किया जाता है। जहां तक ​​यादृच्छिक चयन के वितरण का सवाल है, यह एकसमान है। एक संपत्ति के साथ 100% संभावना है कि इसे चुना जाएगा। दो के साथ 50% मौका है या तो चयनित किया जाएगा। तीन 33.3% के साथ। और इसी तरह। इस समाधान में न्यूनतम मेमोरी फ़ुटप्रिंट है।
— कॉन्स्टेबलब्रेव

3
@ द्रविड़दास तीन तत्वों के अनुक्रम पर विचार करते हैं। पहले वाले को 1. की संभावना के साथ चुना जाता है। हालांकि, इसे बदला जा सकता है (ध्यान दें कि हम 1/2 के प्रायिकता के साथ दूसरे तत्व द्वारा तुरंत वापस नहीं आते हैं)। बदले में दूसरा तत्व 1/3 की संभावना के साथ तीसरे तत्व द्वारा प्रतिस्थापित किया जा सकता है। तो हम पी (प्रथम) = पी (पहले उठाया) * पी (दूसरा उठाया नहीं) * पी (तीसरा नहीं उठाया) = १ * १/२ * २/३ = १/३; पी (दूसरा) = पी (दूसरा उठाया) * पी (तीसरा नहीं उठाया गया) = 1/2 * 1/3 = 1/3; पी (तीसरा) = पी (तीसरा उठाया) = 1/3।
— मार्टिन टॉर्नवाल

19

मुझे नहीं लगता था कि कोई भी उदाहरण पर्याप्त रूप से भ्रमित कर रहा था, इसलिए यहाँ उदाहरण के लिए एक ही चीज़ को पढ़ना बहुत कठिन है।

संपादित करें: आप शायद ऐसा न करें जब तक कि आप अपने सहकर्मियों से नफरत नहीं करना चाहते।

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

4
यह वास्तव में सबसे उचित समाधान है
— पवेल

2
मुझे यह सबसे अधिक पसंद है, स्पष्टीकरण और सब कुछ के साथ और एक वास्तविक उदाहरण POJO भी शामिल है। महान उत्तर, अधिक उत्थान के हकदार हैं! बस सब कुछ समझने में इतना आसान हो जाता है!
— टिग्रि्र्रर

1
सबसे अच्छा उपाय! यह सबसे अधिक मतदान होना चाहिए।
— 20

15

आप केवल ऑब्जेक्ट के माध्यम से चलते समय चाबियों का एक सरणी बना सकते हैं।

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

फिर, चाबियाँ से एक तत्व को बेतरतीब ढंग से चुनें:

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

13
Object.key यहाँ उपयोगी हैvar keys = Object.keys(obj)
— whadar

डांग << मैथ.फ्लोर () का उपयोग करने की तुलना में बहुत अधिक सुंदर है, शायद कम महंगा भी है। मैं वास्तव में नीचे उतर गया हूं और सीखता हूं कि उन बिटवाइज़ ऑपरेटरों का उपयोग कैसे करें।
— पॉल जे

5
इस मामले में बिटवाइज़ ऑपरेटर का उपयोग हैक होने की अधिक संभावना है, क्योंकि इसे इनपुट के रूप में पूर्णांक की आवश्यकता होती है, यह संख्या को रूपांतरित करता है। << 0पूर्णांक पर लागू करने से कुछ नहीं होगा। parseInt()वही काम करेगा। तो कम समझने योग्य कोड लिखने के अलावा यहां सीखने के लिए कुछ भी नहीं है।
— लैंडर

13

यदि आप पुस्तकालयों का उपयोग करने में सक्षम हैं, तो आप पा सकते हैं कि लो-डैश जेएस लाइब्रेरी में ऐसे मामलों के लिए बहुत उपयोगी तरीके हैं। इस मामले में, आगे बढ़ें और जांच करें_.sample() ।

(नोट लो-डैश कन्वेंशन लाइब्रेरी ऑब्जेक्ट का नामकरण कर रहा है _। इस प्रोजेक्ट के लिए इसे सेट करने के लिए एक ही पेज में इंस्टॉलेशन की जांच करना न भूलें।)

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

अपने मामले में, आगे बढ़ें और उपयोग करें:

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

3

यदि आप अंडरस्कोर का उपयोग कर रहे हैं। तो क्या आप कर सकते हैं:

_.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);

0

ऐसा करने का एक और सरल तरीका एक फ़ंक्शन को परिभाषित करना होगा जो लागू होता है 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.

क्या आपका मतलब Object.values ​​(someObject) [इंडेक्स] है?
— बेम्मू

सूचकांक चर है कि मैं उत्पन्न स्टोर करने के लिए उपयोग किया है यादृच्छिक संख्या सिर्फ एक कंटेनर, कुछ भी खास है। अगर मैंने जेनरेट किए गए नंबर को दूसरे वेरिएबल में स्टोर नहीं किया था, तो फंक्शन के प्रत्येक इंस्टेंस को getRandomArbitraryहर बार एक नया रैंडम नंबर जेनरेट किया जाएगा।
— सुशांत चौधरी

0

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

यह फ़ंक्शन यादृच्छिक संपत्ति के अंदरूनी हिस्से को लौटाएगा।


0

जावास्क्रिप्ट ऑब्जेक्ट से यादृच्छिक संपत्ति लेने के लिए आप निम्न कोड का उपयोग कर सकते हैं:

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

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके।
— निक 3500
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.