2012-01-23 18 views
5

मैं जावास्क्रिप्ट में गाने की एक प्लेलिस्ट बना रहा हूं। मैं एक साहचर्य सरणी foo का इस्तेमाल किया है - मेरी वस्तु की संरचना के लिए समान दिखता है:जावास्क्रिप्ट में सहयोगी सरणी से यादृच्छिक तत्व प्राप्त करें?

foo[songID] = songURL; 

मैं कार्यक्षमता फेरबदल में बनाने की कोशिश कर रहा हूँ। मैं इस सूची से यादृच्छिक रूप से एक गीत का चयन करना चाहता हूं। ऐसा करने का कोई आसान तरीका है - सरणी अनुक्रमित नहीं है।

उत्तर

0

आप कुछ इस तरह की कोशिश कर सकते:

var obj = { 
    'song1': 'http://...1', 
    'song2': 'http://...2', 
    'song3': 'http://...3', 
    'song4': 'http://...4', 
    'song5': 'http://...5', 
    'song6': 'http://...6', 
}, tempArr = [], len, rand, song; 

for (var key in obj) 
    if (obj.hasOwnProperty(key)) 
     tempArr.push(obj[key]); 

len = tempArr.length; 
rand = Math.floor(Math.random() * len); 
song = tempArr[rand]; 
document.write(song); 

ध्यान दें कि यह वास्तव में सिर्फ तथ्य यह है कि इस सामग्री शायद इस तरह की एक संरचना के साथ एक सरणी में होना चाहिए चारों ओर झालर की एक hacky तरीका है:

var songs = [ 
    {title: 'Song1', url: 'http://...1.mp3'}, 
    {title: 'Song2', url: 'http://...2.mp3'}, 
    {title: 'Song3', url: 'http://...3.mp3'} 
]; 
5

आप ऑब्जेक्ट की चाबियों की सरणी प्राप्त करने के लिए Object.keys(object) फ़ंक्शन का उपयोग कर सकते हैं। इस समारोह के लिए बहुत अच्छा दस्तावेज MDN पर पाया जा सकता है।

आपके पास दो अलग-अलग लेकिन संबंधित प्रश्न भी प्रतीत होते हैं।

आपका विषय किसी ऑब्जेक्ट से यादृच्छिक तत्व प्राप्त करने के लिए कहता है। इसके लिए,

var randomProperty = function (object) { 
    var keys = Object.keys(object); 
    return object[keys[Math.floor(keys.length * Math.random())]]; 
}; 

लेकिन आप अपने प्रश्न के शरीर में भी पूछें कि सरणी को कैसे घुमाएं। इसके लिए, आप किसी प्रकार के shuffle फ़ंक्शन चाहते हैं (संभवतः फिशर-येट्स का कार्यान्वयन), और सीधे इसे करें।

var objectKeysShuffled = function (object) { 
    return shuffle(Object.keys(object)); 
}; 
+1

यह उल्लेख है कि इस IE में काम नहीं करेगा लायक है <8. –

+0

@kennis - यही कारण है कि आईई होना चाहिए <9. – RobG

+0

हम्म, इस पर वापस देख, मैं प्रश्न पढ़ने में भूलना। यह पूछ रहा था कि कैसे शफल करना है, और मैंने एक यादृच्छिक गीत चुनने के लिए एक समारोह दिया ... ओह। ध्यान देने योग्य मुख्य बात यह है कि जब आपके पास ऑब्जेक्ट.की के साथ सरणी हो, तो आप इसे घुमा सकते हैं। – Havvy

0
function fetchRandom(arr) { 
    var ret, 
     i = 0; 
    for (var key in arr){ 
     if (Math.random() < 1/++i){ 
      ret = key; 
     } 
    } 
    return ret; 
} 

var randomSong = foo[fetchRandom(foo)]; 

आप इस के लिए एक वस्तु का उपयोग करना चाहिए। फिर यादृच्छिकरण के लिए वस्तुओं की एक अनुक्रमित सरणी का उपयोग करें, लेकिन यह आपके प्रश्न का उत्तर देना चाहिए।

+0

ट्रिविअल बग: यह हमेशा पहली कुंजी देगा क्योंकि पहले पुनरावृत्ति के दौरान, मैं === 0, और 1/++ मैं हमेशा Math.random() से अधिक होगा। – Havvy

+1

नॉनट्रिविली, आप प्रत्येक कुंजी के लिए एक अलग यादृच्छिक संख्या की गणना कर रहे हैं। यहां तक ​​कि यदि Math.random() पूरी तरह यादृच्छिक था, तो आपका फ़ंक्शन संभवतः वास्तव में यादृच्छिक परिणाम नहीं दे सकता है। 'एन' वें तत्व के लिए संभावना' (एन/लंबाई) * उत्पाद ([1, एन), एन/लंबाई) ', एन/लंबाई नहीं होगी। – Havvy

0

एक अक्षम विधि है:

function randomProperty(obj) { 
    var a = []; 
    for (var p in obj) { 
    if (obj.hasOwnProperty(p)) { 
     a.push(p); 
    } 
    } 
    return a.length? obj[ a[a.length * Math.random() | 0]] : void 0; 
} 

के रूप में अन्य लोगों ने कहा, और अधिक कुशल दुकान संपत्ति नाम सरणी और पुनः उपयोग करें, यह हर बार बनाने के लिए की तुलना में।

2

यह वह कार्य है जिसे मैंने ऑडियो तत्वों के हैश से यादृच्छिक पृष्ठभूमि गीत चलाने के लिए बनाया है।

this.bgm = {} //I later added audio elements to this 
this.playRandomBGM = function() 
{ 
    var keys = Object.keys(this.bgm); 
    self.currentBGM = keys[Math.floor(keys.length * Math.random())]; 
    console.log("Playing random BGM: " + self.currentBGM); 
    self.bgm[self.currentBGM].play(); 
} 
+0

यह संदिग्ध रूप से मेरे उत्तर की तरह एक फ़ंक्शन में उल्लिखित लगता है जो प्रश्न से संबंधित बहुत सारे शोर कोड को जोड़ता है। आपकी चौथी और पांचवीं लाइनें मेरे समान हैं, सिवाय इसके कि आपने 'self.currentBGM =' के साथ 'रिटर्न' को प्रतिस्थापित किया है, भले ही पूछे जाने वाले प्रश्न में कोई 'स्वयं' या 'वर्तमान बीजीएम' न हो। – Havvy

संबंधित मुद्दे