2010-12-07 8 views
2

Also, wenn ich habe:Wie konvertiere ich einen JSON Hash von Hashes in einen Hash von Arrays in Javascript?

var hashof = {"stuff": 
{"1": { "name": "fred"}}, 
{"2": { "name": "barney"}} 
}; 

Wie kann ich eine Javascript-Funktion benutzen Sie:

var hashof = {"stuff": 
["name" : "fred"], 
["name" : "barney] 
}; 

Ich möchte die Struktur mit mustache.js verwenden können.

+0

Was Sie haben (das erste Stück Code) ist nicht gültig JS: * "SyntaxError: Unerwartetes Token {" * Also, was hast du wirklich? –

+0

Das unerwartete Token kommt wahrscheinlich von dem fehlenden Zitat nach "Barney" - sonst ist es gültig –

+1

@Ryan Kinal: Ah du bist richtig mit dem Zitat. Aber auch damit ist es nicht gültig, der Fehler ist: * SyntaxError: Unexpected token: *. Wenn ich es so schreibe: '{" stuff ": {" 1 ": {" name ":" fred "}}, {" 2 ": {" name ":" barney "}}}' sollte es sein ziemlich klar, dass dies nicht gültig sein kann. Da fehlt der Schlüssel zwischen '}},' und '{" 2 ":'. –

Antwort

2

Letzteres ist nicht möglich. Es ist ungültig. Sie wollten wohl so etwas wie folgt aus:

var hashof = {"stuff": [ 
    {"name" : "fred"}, 
    {"name" : "barney"} 
] }; 

Die folgende Beschreibung ist es zu konvertieren, wie Sie es brauchen:

function convert(input) { 
    var output = [], 
     key; 

    for (key in input.stuff) { 
     if (input.stuff.hasOwnProperty(key)) { 
      output[parseInt(key, 10)] = input.stuff[key]; 
     } 
    } 

    return {stuff: output}; 
} 

Denken Sie daran, dass die resultierende Anordnung spärlich sein kann. Wenn Sie dies vermeiden wollen, können Sie die Zeile

output[parseInt(key, 10)] = input.stuff[key]; 

mit

output.push(input.stuff[key]); 

verwenden ersetzen, aber Sie werden nicht in der Lage sein, die ursprünglichen Schlüssel zu erhalten, dann (nicht sichergestellt ist, zumindest) .

+0

Entschuldigung, ja. Vielen Dank. – richt

1

Javascript muss nicht assoziativen Arrays. Das Äquivalent ist ein "Hash", wie Sie es nennen, oder ein Objekt, das ist, was es tatsächlich ist. Das Beste, auf das Sie hoffen können, ist das: {"stuff": [{"name": "fred"}, {"name": "barney"}]}

Das Folgende ist ungetestet, sollte Ihnen aber zumindest in die richtige Richtung weisen.

var input = {"stuff": {"1": { "name": "fred"}}, {"2": { "name": "barney"}} }, 
    output = {}, key, innerKey; 
for key in input 
{ 
    output[key] = []; 
    for innerkey in input[key] 
    { 
     output[key].push(input[key][innerKey]); 
    } 
} 

Edit: Es scheint, dass das Eingabeobjekt nicht das Format hat ich erwartet habe (oder in der Tat, das Format ich gelesen, als ich es zum ersten Mal gelesen). Es Strom hat zwei Eigenschaften:

  • „stuff“ gleich {"1": {"name": "fred"}}
  • Es gibt eine andere unverkeilten Artikel ist, der zu {"2": {"name": "barney"}} gleich ist (der Schlüssel sein könnte 0, ich bin nicht sicher, in diesem Punkt)

So hat input.stuff nur einen Artikel, während input[0] einen anderen Artikel hat. Wenn es wie folgt, würde es mehr Sinn machen:

var input = { 
    "stuff": { 
     "1": {"name": "fred"}, 
     "2": {"name": "barney"} 
    } 
} 

Wenn dies der Fall wäre, mein obiger Code funktionieren würde. Mit der gegebenen Eingabe wird es nicht.

+0

Testen Sie jetzt. ... Danke – richt

+0

Wenn Sie weiter darüber nachdenken, ist eine Konvertierung von dem Format in meiner Bearbeitung zu dem Format, das Sie wollten, ein strittiger Punkt. Das Format in meiner Bearbeitung entspricht in etwa einem 1-indizierten Array innerhalb eines Objekts. –

+0

Ryan- Ich benutze Dot-Net-JSONUTILS, um json von einer ms-access db (keine Wahl) zu wrangle und, ja, die Daten sind, wie Sie es dargestellt haben. Ich arbeite nur mit ff 3.6.12 Fehler Konsole und bekomme keine Fehler. Vielen Dank!!! – richt

0

Ich sollte das wirklich testen, aber schnell und dreckig sieht es aus wie es funktionieren wird ...

$.each(hashof.stuff, function(index, val) { 
    hashof.stuff[index] = val.index; 
    }); 
+0

Sieht wie ein starkes Argument für jquery aus (das ist jquery, ja?). – richt

+0

Ja, ich glaube, die ursprüngliche Frage hatte ein jQuery-Tag .... aber ich habe mich vorher geirrt. – Hogan

Verwandte Themen