2012-01-23 20 views

cevap

0

Böyle bir şey deneyebilirsiniz:

: Bu gerçekten bu malzeme muhtemelen böyle bir yapı ile bir dizideki olması gerektiği gerçeği etrafında süpürgelik sadece hacky yol olduğunu

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

Not

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

Nesnenin anahtarlarının bir dizisini almak için Object.keys(object) işlevini kullanabilirsiniz. Bu işlev için çok iyi belgeler MDN adresinde bulunabilir.

Ayrıca iki farklı ama birbiriyle ilgili sorularınız var gibi görünüyor.

Konunuz, bir nesneden rasgele bir öğenin nasıl alınacağını sorar. Bunun için, sorgunun gövdesinde diziyi nasıl karıştırılacağını da soruyorsunuzdur. Bunun için, bir çeşit shuffle işlevi (muhtemelen bir Fischer-Yates uygulaması) isteyeceksiniz ve bunu doğrudan yapın.

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

Bu IE'de çalışmaz belirtmekte yarar var <8. –

+0

@kennis - Bu IE olmalıdır <9. – RobG

+0

Hmm, bunun için de bakarak Soru oynanırsa. Nasıl karıştırılacağını soruyordum ve rastgele bir şarkıyı seçmek için bir işlev verdim ... whoops. Unutulmaması gereken ana şey, Object.keys ile bir diziniz olduğunda, onu karıştırmanızdır. – 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)]; 

Bunun için bir nesne kullanmalıdır. Ardından, randomizasyon için dizinlenmiş bir nesne dizisi kullanın, ancak bu sorunuza cevap vermelidir.

+0

Önemsiz hata: Bu her zaman ilk anahtarı verir çünkü ilk iterasyonda i === 0 ve 1/++ i her zaman Math.random() 'dan daha büyük olacaktır. – Havvy

+1

Önemli değil, her anahtar için farklı bir rasgele sayı hesaplıyorsunuz. Math.random() tamamen rastgele olsa bile, fonksiyonunuz gerçekten rastgele bir sonuç veremez. 'N' elemanı için olasılık (N/uzunluk) * Ürün ([1, N), N/Uzunluk) ', N/Uzunluk değil. – Havvy

0

bir etkisiz bir yöntemdir: diğerleri söz konusu gibi

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

, çok daha verimli deposu özelliği adı dizi ve her zaman yapmak için daha da yeniden kullanımı.

2

Bu, ses öğelerinin bir karmaşasından rastgele bir arka plan şarkısı çalmak için yaptığım işlevdir.

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

Bu, şüpheli bir şekilde benim yanıtımın, soruyla ilgisi olmayan bir sürü gürültülü kod ekleyen bir işleve benzetilmesi gibi görünüyor. Dördüncü ve beşinci satırlarınız benimkiyle özdeştir, aksi takdirde 'self' veya "currentBGM" sorusu sorulmamış olsa bile, 'self.currentBGM = ile değiştirilmiştir. – Havvy

İlgili konular