2010-09-15 16 views
19

मुझे JSON परिणाम से यादृच्छिकरण लागू करने की आवश्यकता है।जावास्क्रिप्ट - किसी ऑब्जेक्ट के अंदर ऑब्जेक्ट्स को शफल करना (यादृच्छिक)

परिणाम:

प्रश्न (वस्तु)

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

विषय (वस्तु)

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

मैं

JSON का स्वरूप दो वस्तुओं है चाहता हूं o प्रश्न वस्तु और विषय वस्तुओं के अंदर वस्तुओं के क्रम को यादृच्छिक करें।

+1

वे ऑब्जेक्ट्स नहीं हैं, वे ** सरणी ** ऑब्जेक्ट्स हैं। –

उत्तर

26

आप एक Fisher-Yates-Durstenfeld shuffle इस्तेमाल कर सकते हैं: यह इस फ़ंक्शन का उपयोग करता

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

मुझे Fisher-Yates algorithm का उपयोग करके this post पर जावास्क्रिप्ट में एक सरणी को घुमाने के लिए मिला।

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

आपको 'tempj' – pepkin88

+0

एक चैंप की तरह काम करने की ज़रूरत नहीं है! –

7

सबसे सरल विधि (सही नहीं फेरबदल, लेकिन कुछ मामलों में बेहतर हो सकता है):

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

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

या

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

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

+2

बड़े सरणी के लिए यह संभवत: फिशर-येट्स की तुलना में धीमा हो जाएगा। शफल ओ (एन) होगा जबकि क्रमबद्ध (संभवतः) ओ (एन लॉग एन) होगा। – LukeH

+2

@LukeH ठीक है, आप सही हैं। लेकिन यह और अधिक सुंदर है: पी – pepkin88

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