2012-11-04 12 views
8

Ich habe ein Objekt wiekonvertieren komplexes JavaScript-Objekt zu Punktnotation Objekt

{ "status": "success", "auth": { "code": "23123213", "name": "qwerty asdfgh" } } 

Ich mag es konvertieren Notation (eine Ebene) Version wie zu Punkt:

{ "status": "success", "auth.code": "23123213", "auth.name": "qwerty asdfgh" } 

Derzeit bin Umwandlung I der Objekt per Hand mit Feldern, aber ich denke, es sollte eine bessere und allgemeinere Art sein, dies zu tun. Gibt es irgendwelche?

Hinweis: Es gibt einige Beispiele, die den umgekehrten Weg zeigen, aber ich konnte die genaue Methode nicht finden.

Hinweis 2: Ich möchte es mit meiner serverseitigen Controller-Aktionsbindung verwenden.

+1

analysieren, um die JSON-String ... iterata darüber Subitems ist und nach, dass es zu JSON-String zurück zu konvertieren – Reflective

+1

@Elias Van Ootegem: Es ist kein gültiger Bezeichner, aber jeder String ein gültiger Eigenschaftsnamen . – pimvdb

+0

nach dem Parsing können Sie auf 'code' mit' author.code' zugreifen, da 'auth' ein Objekt ist und' code' eine Eigenschaft dieses Objekts ist. – Reflective

Antwort

18

können Sie rekursiv die Eigenschaften auf ein neues Objekt hinzufügen und dann zu JSON konvertieren:

var res = {}; 
(function recurse(obj, current) { 
    for(var key in obj) { 
    var value = obj[key]; 
    var newKey = (current ? current + "." + key : key); // joined key with dot 
    if(value && typeof value === "object") { 
     recurse(value, newKey); // it's a nested object, so do it again 
    } else { 
     res[newKey] = value; // it's not an object, so set the property 
    } 
    } 
})(obj); 
var result = JSON.stringify(res); // convert result to JSON 
+0

Ich schrieb eine andere Funktion mit Präfix-Funktion. Ich konnte deinen Code nicht ausführen, aber ich habe die Antwort erhalten. Danke – vardars

1

ich eine andere Funktion mit dem Präfix-Funktion geschrieben. Ich konnte deinen Code nicht ausführen, aber ich habe die Antwort erhalten. Dank

https://github.com/vardars/dotize

var dotize = dotize || {}; 

dotize.convert = function(jsonobj, prefix) { 
    var newobj = {}; 

    function recurse(o, p, isArrayItem) { 
     for (var f in o) { 
      if (o[f] && typeof o[f] === "object") { 
       if (Array.isArray(o[f])) 
        newobj = recurse(o[f], (p ? p + "." : "") + f, true); // array 
       else { 
        if (isArrayItem) 
         newobj = recurse(o[f], (p ? p : "") + "[" + f + "]"); // array item object 
        else 
         newobj = recurse(o[f], (p ? p + "." : "") + f); // object 
       } 
      } else { 
       if (isArrayItem) 
        newobj[p + "[" + f + "]"] = o[f]; // array item primitive 
       else 
        newobj[p + "." + f] = o[f]; // primitive 
      } 
     } 
     return newobj; 
    } 

    return recurse(jsonobj, prefix); 
}; 
+1

Wenn es funktioniert, dann ist das in Ordnung, aber dieser Code erfordert, dass jeder Eigenschaftenname mindestens einen Punkt enthält. Das ist bei "Erfolg" nicht der Fall. – pimvdb

+0

ja, das habe ich erkannt und versucht, mit der Verwendung von globalen Var zu beheben. :) – vardars

+0

github Bibliothek ist aktualisiert, hat einige Tests. Ich kann diese Antwort nicht regelmäßig aktualisieren, tut mir leid. – vardars

4

Hier ist ein fix/hacken, wenn Sie undefined für den ersten Präfix erhalten. (Ich habe)

var dotize = dotize || {}; 

dotize.parse = function(jsonobj, prefix) { 
    var newobj = {}; 
    function recurse(o, p) { 
    for (var f in o) 
    { 
     var pre = (p === undefined ? '' : p + "."); 
     if (o[f] && typeof o[f] === "object"){ 
     newobj = recurse(o[f], pre + f); 
     } else { 
     newobj[pre + f] = o[f]; 
     } 
    } 
    return newobj; 
    } 
    return recurse(jsonobj, prefix); 
}; 
Verwandte Themen