2013-02-04 5 views
5

Ich habe ein JSON-Objekt, das aus einer langen Liste von anderen JSON-Objekte besteht, die einige gemeinsame Eigenschaften zueinander, so haben:Wie wird ein zufälliges JSON-Objekt nach Schlüssel aus dem JSON-Wörterbuch abgerufen?

var myData = { 
    "0291" : { "Firstname" : "Jeremy", "Surname" : "Dyson" }, 
    "0398" : { "Firstnname" : "Billy", "Surname" : "Bunter" }, 
    "6714" : { "Firstnname" : "Harry", "Surname" : "Peterson" }, 
    "9080" : { "Firstnname" : "Barry", "secondname": "Joe", "Surname" : "Mainwaring"} 
    ... 
    ... 
} 

ich bereits eine HTML-Vorlage erstellt. Mit dem JS möchte ich durch die Objekte in den Daten {} in zufällige Reihenfolge auswählen oder iterieren (zufällige Auswahl + Schleife), so dass ich den HTML-Code für jeden Besucher im laufenden Betrieb füllen kann. Der zufällige Teil ist wichtig, daher erhält jeder Besucher wahrscheinlich andere Daten.

Einfache JavaScript- oder jQuery-Lösungen funktionieren in dem Kontext, in dem sie implementiert werden.


EDIT: Lösung I ist unten umgesetzt.

1. Sammeln Sie alle Schlüssel:

var keyArray = Object.keys(myData); 

2. Shuffle function:

function shuffle(o){ //v1.0 
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); 
    return o; 
}; 
keyArray = shuffle(keyArray); // shuffle it! 

3. Schleife iterieren:

for (var i = 0; i < keyArray.length; ++i) { 
    var current = data[keyArray[i]]; 
    ... // what you want to do each time. 
} 
+0

Was die JSON generiert? Scheint, als wäre es einfacher, es zu diesem Zeitpunkt randomisieren –

+0

@ explosion: Ich beginne zu kodieren, schreibe ich die 4000 Zeilen lexikalische Datenbank von Hand. Keine Zufallsfunktion ... noch! – Hugolpz

Antwort

4

Zuerst das data Objekt in ein Array umwandeln (die Tasten auf der ersten Ebene gehen verloren), wie hier gezeigt: https://stackoverflow.com/a/11474071/664108

var dataArray = $.map(data, function (value, key) { return value; }); 

Dann das Array mischen (siehe How to randomize (shuffle) a JavaScript array?)

Alternativ Sie könnten einfach die Tasten mischen und dann das ursprüngliche Objekt bearbeiten. Auf diese Weise können auch noch die Schlüssel haben:

var keyArray = $.map(data, function (value, key) { return key; }); 

shuffle(keyArray); // example (shuffle function has to be implemented, see above) 

for (var i = 0; i < keyArray.length; ++i) { 
    var current = data[keyArray[i]]; 
    // do stuff with current dataset 
} 

Addition aus den Kommentaren

das Tastenfeld kann auch erstellt werden:

var keyArray = Object.keys(data); 

Aber beachten Sie, dass dies nur funktioniert auf modernen Browser sollten Sie nicht verwenden, wenn Sie Internet Explorer in Versionen bis IE 8 unterstützen möchten (siehe: http://msdn.microsoft.com/en-us/library/ie/ff688127(v=vs.94).aspx)

+0

Ich denke, ich werde die Schlüssel brauchen. In der Tat muss ich jetzt wieder meine Daten> einen zufälligen Schlüssel> erfassen, um die Werte auszuwählen, die ich möchte. – Hugolpz

+0

Ja, das ist meine zweite Lösung –

+1

anstatt: var keyArray = $ .map (Daten, Funktion (Wert, Schlüssel) {return key;}); Verwenden wir: var keyArray = Object.keys (Daten); – Hugolpz

3

Haben Sie darüber nachgedacht, den JSON nach dem Zufallsprinzip zu erstellen oder ihn zu mischen? Shuffle in Javascript

Wenn Sie das Array mischen, können Sie foreach anwenden, und Sie erhalten die Elemente in zufälliger Reihenfolge. :)

Hinweis: Es könnte schneller sein, nur eine Kopie der IDs zu mischen.

Haftungsausschluss! Ich dachte, dass für Ihren Fall brauchen Sie nur Pseudorandomness.

+0

Ja, Pseudozufall wird in Ordnung sein. – Hugolpz

+0

Mario, nochmals vielen Dank. Deine Kommentare wurden wirklich an den Anfänger angepasst, ich war wirklich auf der Suche nach einer ** shuffle ** Funktion. – Hugolpz

+0

Sie sind herzlich willkommen! –

Verwandte Themen