2010-09-15 65 views
19

Tôi cần triển khai ngẫu nhiên từ kết quả JSON.JavaScript - Xáo trộn các đối tượng bên trong một đối tượng (ngẫu nhiên)

Định dạng của JSON là hai đối tượng:

kết quả:

Câu hỏi (object)

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

Topic (object)

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

tôi muốn t o ngẫu nhiên hóa thứ tự của các đối tượng bên trong đối tượng câu hỏi và các đối tượng chủ đề.

+1

Đó không phải là đối tượng, đó là các mảng ** chứa các đối tượng. –

Trả lời

26

Bạn có thể sử dụng một 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

Tôi đã tìm thấy this post khi sử dụng Fisher-Yates algorithm để trộn một mảng bằng JavaScript. Nó sử dụng chức năng này:

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

Bạn không cần phải làm cho 'tempj' – pepkin88

+0

hoạt động như một nhà vô địch! –

7

phương pháp dễ nhất (ngẫu nhiên không hoàn hảo, nhưng trong một số trường hợp có thể được tốt hơn):

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

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

hoặc

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

Đối với mảng lớn hơn, điều này (có thể) sẽ chậm hơn so với trộn ngẫu nhiên Fisher-Yates. Shuffle sẽ là O (n) trong khi sử dụng sắp xếp sẽ (có thể) là O (n log n). – LukeH

+2

@ LukeH OK, bạn nói đúng. Nhưng điều này đẹp hơn: P – pepkin88

Các vấn đề liên quan