একটি জাভাস্ক্রিপ্ট অবজেক্ট থেকে এলোমেলো সম্পত্তি বাছুন


90

ধরুন আপনার কাছে জাভাস্ক্রিপ্ট অবজেক্টের মতো {'বিড়াল': 'মিয়া', 'কুকুর': 'ওওফ' ... the এই দীর্ঘ বাঁকানো পথের চেয়ে অবজেক্ট থেকে এলোমেলো সম্পত্তি বাছাই করার আরও কি কোনও সূক্ষ্ম উপায় আছে? :

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

ওপি, দয়া করে আপনার নির্বাচিত উত্তরটি পুনরায় চয়ন করুন ... @ টেনিটেম অন্যের সামনে এটির সঠিক উত্তর দিয়েছেন। ডেভিডের উত্তরটি কেবল খারাপ কোডিং (যদিও এটি কাজ করে)
vsync

নোট করুন যে প্রশ্ন এবং উত্তরগুলি আসলে একটি এলোমেলো বস্তুর বৈশিষ্ট্যের মান প্রত্যাবর্তনের জন্য সন্ধান করে, প্রশ্নের শিরোনামের মতো এলোমেলো সম্পত্তি নয়।
কনটুর

উত্তর:


184

নির্বাচিত উত্তরটি ভাল কাজ করবে। তবে এই উত্তরটি দ্রুত চলবে:

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

4
এটি আরও ভাল কারণ এটি কোনও লুপ ব্যবহার করে না
ডমিনিক

14
আমি কিছু টেস্টিং করেছি এবং এটি প্রদর্শিত হবে যে নির্বাচিত উত্তরটি ঠিক কাজ করে এবং সম্পত্তি নির্বাচনের পক্ষপাতহীন (প্রতিক্রিয়াগুলির মধ্যে অনুমানের বিপরীতে); তবে, আমি ১,000০,০০০ কী সহ কোনও বস্তুর উপর পরীক্ষা করেছি এবং এখানে সমাধানটি নির্বাচিত সমাধানের চেয়ে দ্বিগুণ দ্রুত ছিল।
ড্রাগনফ্লাই

8
<< 0 (0 দ্বারা বাম দিকে বিট শিফট) ম্যাথ.গ্রাউন্ড () লেখার একটি শর্টহ্যান্ড পদ্ধতি?
সিস্টেমেমিকালিউরাল

4
এই jsperf jsperf.com/random-object-property-se ले শন এই উত্তরটি এবং নির্বাচিত উত্তরটিকে বেনমার্ক করে । এই উত্তরটি ছোট বস্তুর (100 টি বৈশিষ্ট্য) জন্য 3x দ্বারা আরও ভাল সম্পাদন করে। বৃহত্তর অবজেক্ট (100 কে বৈশিষ্ট্য) পার্থক্য 2x আরও ভাল ড্রপ করে।
কনস্টেবলব্রু

4
@ মুহাম্মাদউমার - নং 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;
}

4
ECMAScript স্ট্যান্ডার্ডটি বৈশিষ্ট্যগুলি সর্বদা একই ক্রমে বিভ্রান্ত হওয়া সম্পর্কে কিছু বলে? বেশিরভাগ বাস্তবায়নের ক্ষেত্রে অবজেক্টগুলির স্থিতিশীল অর্ডার থাকে তবে আচরণটি অনুমিত হয়: স্ট্যাকওভারফ্লো
ব্রেন্ডন বার্গ

4
এটিতে অবজেক্টের প্রথম উপাদানটির দিকে একটি স্কিউ রয়েছে বলে মনে হচ্ছে। আমি এখনও বুঝতে পারি না কেন!
কোল গ্লিসন

7
এটি কখনই প্রথম সম্পত্তিটি নির্বাচন করবে না (ম্যাথআর্যান্ডম সর্বদা <1) এবং তার পরে প্রতিটি সংখ্যার নির্বাচিত হওয়ার 0.5 সুযোগ থাকবে। সুতরাং দ্বিতীয় সম্পত্তির জন্য ০.০৫, তৃতীয়টির জন্য ০.০৫, চতুর্থ ইত্যাদির জন্য ০.০২৫ ইত্যাদি
সিস্টেমিকপ্লুরাল

4
কিছু সংশোধন: এই ফাংশনটি প্রথম সম্পত্তি নির্বাচন করতে পারে। প্রথম পুনরাবৃত্তিতে, গণনায় উপসর্গের বর্ধন সমীকরণের ডান হাতের দিকটি 1/1 == 1 এ মূল্যায়ন করে Since এক্সপ্রেশন সত্যকে মূল্যায়ন করে এবং প্রথম সম্পত্তিটি নির্বাচিত হয়। এলোমেলো নির্বাচনের বিতরণ যতটা যায় ততই তা অভিন্ন। একটি বৈশিষ্ট্যের সাথে এটির জন্য 100% সুযোগ রয়েছে। দুটি দিয়ে একটি 50% সুযোগ বাছাই করা হবে। তিনটি একটি 33.3% দিয়ে। ইত্যাদি। এই সমাধানটির একটি ন্যূনতম মেমরির পদচিহ্ন রয়েছে।
কনস্টেবলব্রু

4
@ দেবিধাদাস তিনটি উপাদানের ক্রম বিবেচনা করুন। প্রথমটি 1 এর 1 এর সম্ভাব্যতার সাথে বাছাই করা হয় However তবে, এটি পরিবর্তিত হতে পারে (লক্ষ্য করুন যে আমরা অবিলম্বে ফিরে আসছি না!) দ্বিতীয় উপাদান দ্বারা 1/2 এর সম্ভাবনা রয়েছে। দ্বিতীয় উপাদানটি পরিবর্তে তৃতীয় উপাদান দ্বারা 1/3 এর সম্ভাব্যতা দ্বারা প্রতিস্থাপিত হতে পারে। সুতরাং আমরা পি (প্রথম) = পি (প্রথম বাছাই করা) * পি (দ্বিতীয়বার বাছাই করা হয়নি) * পি (তৃতীয়টি বাছাই করা হয়নি) = 1 * 1/2 * 2/3 = 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
এটি আসলে সবচেয়ে যুক্তিসঙ্গত সমাধান
পাওয়ে

4
আমি ব্যাখ্যা এবং সবকিছু সহ এটিকে সবচেয়ে পছন্দ করি এবং এতে একটি প্রকৃত উদাহরণ পওওও অন্তর্ভুক্ত থাকে। দুর্দান্ত উত্তর, আরও উন্নয়নের দাবি! সবকিছু বুঝতে এত সহজ করে তোলে!
টাইগারারr

15

আপনি অবজেক্টটি দিয়ে চলার সময় কীগুলির একটি অ্যারে তৈরি করতে পারেন।

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

তারপরে, এলোমেলোভাবে কীগুলি থেকে কোনও উপাদান বাছুন:

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

13
অবজেক্ট.কিজ এখানে কার্যকরvar keys = Object.keys(obj)
ওহদার

ডাঃ << ম্যাথ.ফ্লুর () ব্যবহারের চেয়ে অনেক বেশি কৌতূহলযুক্ত, সম্ভবত খুব কম ব্যয়বহুল। আমি সত্যিই নামতে হবে এবং কীভাবে এই বিটওয়াস অপারেটরগুলি ব্যবহার করতে হবে তা শিখতে হবে।
পল জে

4
এই ক্ষেত্রে বিটওয়াইস অপারেটরের ব্যবহার সম্ভবত হ্যাক হওয়ার সম্ভাবনা বেশি কারণ এটি একটি ইনপুট হিসাবে একটি পূর্ণসংখ্যার প্রয়োজন হয়, এটি সংখ্যাকে রূপান্তর করে। << 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.

আপনি কি অবজেক্ট.ভেলুয়েজ (কিছু অবজেক্ট) [সূচক] বলতে চান?
বেমমু

সূচক পরিবর্তনশীল যে আমি উত্পন্ন সঞ্চয় করতে ব্যবহার করেছি র্যান্ডম সংখ্যা মাত্র একটি ধারক, কিছুই বিশেষ। আমি যদি জেনারেটেড নম্বরটি অন্য ভেরিয়েবলের মধ্যে সংরক্ষণ না করে থাকি তবে ফাংশনের প্রতিটি উদাহরণ 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.