2010-09-15 15 views
19

JSON sonucundan bir rasgele uygulama yapmam gerekiyor.JavaScript - Bir nesnenin içindeki nesnelerin karıştırılması (rastgele hale getirme)

Sonuç:

soru (nesne)

[Object { id="4c6e9a41470b19_96235904", more...}, 
Object { id="4c784e6e928868_58699409", more...}, 
Object { id="4c6ecd074662c5_02703822", more...}, 6 more...] 

konu (nesne)

[Object { id="3jhf3533279827_23424234", more...}, 
Object { id="4634663466cvv5_43235236", more...}, 
Object { id="47hf3892735298_08476548", more...}, 2 more...] 

I

JSON biçimi, iki nesneleri T istiyorum o soru nesnesinin ve konu nesnelerinin içindeki nesnelerin sırasını rasgele hale getirir.

+1

Bunlar nesneler değildir, bunlar ** diziler ** içeren nesnelerdir. –

cevap

26

Bir Fisher-Yates-Durstenfeld shuffle kullanabilirsiniz: Bu işlevini kullanır

function randomize(a, b) { 
    return Math.random() - 0.5; 
} 

yourQuestionArray.sort(randomize); 
yourTopicArray.sort(randomize); 

veya

yourQuestionArray.sort(function (a, b) {return Math.random() - 0.5;}); 
yourTopicArray.sort(function (a, b) {return Math.random() - 0.5;}); 

(http://jsfiddle.net/dJVHs/)

6

JavaScript'te bir diziyi karıştırmak için Fisher-Yates algorithm numaralı telefonu kullanarak this post numaralı telefonu buldum.

var shuffledQuestionArray = shuffle(yourQuestionArray); 
var shuffledTopicArray = shuffle(yourTopicArray); 

// ... 

function shuffle(sourceArray) { 
    for (var i = 0; i < sourceArray.length - 1; i++) { 
     var j = i + Math.floor(Math.random() * (sourceArray.length - i)); 

     var temp = sourceArray[j]; 
     sourceArray[j] = sourceArray[i]; 
     sourceArray[i] = temp; 
    } 
    return sourceArray; 
} 
+5

'tempj' – pepkin88

+0

' un bir şampiyon gibi çalışmasına gerek yok! –

7

En kolay yöntem (mükemmel değil karıştır, ancak bazı durumlarda daha iyi olabilir)::

function fisherYates (myArray) { 
    var i = myArray.length; 
    if (i == 0) return false; 
    while (--i) { 
    var j = Math.floor(Math.random() * (i + 1)); 
    var tempi = myArray[i]; 
    var tempj = myArray[j]; 
    myArray[i] = tempj; 
    myArray[j] = tempi; 
    } 
} 
+2

Daha büyük diziler için bu muhtemelen (muhtemelen) bir Fisher-Yates shuffle'dan daha yavaş olacaktır. Karışım O (n) olurken sıralama kullanılarak (muhtemelen) O (n log n) olur. – LukeH

+2

@LukeH Tamam, haklısın. Ama bu daha güzel: P – pepkin88

İlgili konular