2016-11-25 16 views
3

Ich habe eine sehr einfache JSON, aber in jedem Block habe ich so etwas.Rename json keys iterative

var json = { 
"name": "blabla" 
"Children": [{ 
     "name": "something" 
     "Children": [{ ..... }] 
} 

Und so weiter. Ich weiß nicht, wie viele Kinder rekursiv in jedem Kind sind.

var keys = Object.keys(json); 

for (var j = 0; j < keys.length; j++) { 
    var key = keys[j]; 
    var value = json[key]; 
    delete json[key]; 
    key = key.replace("Children", "children"); 
    json[key] = value; 
} 

Und jetzt möchte ich alle "Kinder" Schlüssel mit Kleinbuchstaben "Kinder" ersetzen. Der folgende Code funktioniert nur für die erste Tiefe. Wie kann ich das rekursiv tun?

+3

Vielleicht ein Hack und nicht die Antwort sind Sie nach, aber wie etwa: 'var s = JSON.stringify (json); var t = s.ersetzen (/ "Kinder"/g, "Kinder"); var newJson = JSON.parse (t); '? – Bardy

+0

Danke @Bardy. arbeitete wie ein Charme – Elsendion

+0

Yay! kein Problem! :) – Bardy

Antwort

2

Eine mögliche Lösung:

var s = JSON.stringify(json); 
var t = s.replace(/"Children"/g, '"children"'); 
var newJson = JSON.parse(t); 
  • Pro: Diese Lösung ist sehr einfach, nur drei Linien zu sein.
  • Nachteile: Es gibt ein Potential unerwünschten Nebeneffekt betrachten:

    var json = { 
        "name": "blabla", 
        "Children": [{ 
        "name": "something", 
        "Children": [{ ..... }] 
        }], 
        "favouriteWords": ["Children","Pets","Cakes"] 
    } 
    

Die Lösung ersetzt alle Instanzen "Children", so dass der Eintrag in dem favouriteWords Array würde auch ersetzt werden, trotz nicht ist ein Name der Eigenschaft. Wenn es keine Chance gibt, dass das Wort an anderer Stelle als dem Namen der Eigenschaft erscheint, dann ist das kein Problem, aber es lohnt sich, es für den Fall zu erhöhen.

3

Es die Eingangsstruktur sieht ist ziemlich gut definiert, so dass Sie einfach eine rekursive Funktion wie diese schaffen könnte:

function transform(node) { 
 
    return { 
 
    name: node.name, 
 
    children: node.Children.map(transform) 
 
    }; 
 
} 
 

 

 
var json = { 
 
    "name": "a", 
 
    "Children": [{ 
 
    "name": "b", 
 
    "Children": [{ 
 
     "name": "c", 
 
     "Children": [] 
 
    }, { 
 
     "name": "d", 
 
     "Children": [] 
 
    }] 
 
    }, { 
 
    "name": "e", 
 
    "Children": [] 
 
    }] 
 
}; 
 

 
console.log(transform(json));

1

Hier ist eine Funktion, die es rekursiv tun können:

function convertKey(obj) { 
    for (objKey in obj) 
    { 

     if (Array.isArray(obj[objKey])) { 
      convertKey[objKey].forEach(x => { 
       convertKey(x); 
      }); 

     } 

     if (objKey === "Children") { 
      obj.children = obj.Children; 
      delete obj.Children; 
     } 
    } 
} 

Und hier ist eine allgemeinere Art und Weise, dies zu tun:

function convertKey(obj, oldKey, newKey) { 
    for (objKey in obj) 
    { 

     if (Array.isArray(obj[objKey])) { 
      obj[objKey].forEach(objInArr => { 
       convertKey(objInArr); 
      }); 
     } 

     if (objKey === oldKey) { 
      obj[newKey] = obj[oldKey]; 
      delete obj[oldKey]; 
     } 
    } 
} 

convertKey(json, "Children", "children"); 
0

Sowohl die angenommene Antwort, und @Tamas Antwort haben leichte Probleme.

Mit @ Bardys Antwort, wie er darauf hinweist, gibt es das Problem, wenn irgendeiner Ihrer Werte das Wort Kinder hatte, würde es Probleme verursachen.

Mit @Tamas ist ein Problem, dass alle anderen Eigenschaften abgesehen von Namen & Kinder fallen gelassen werden. Auch es nimmt ein Kindereigentum an. Und was, wenn das Kindereigentum bereits children ist und nicht Children.

Mit einer leicht modifizierten Version von @Tamas sollte dies die Fallstricke vermeiden.

function transform(node) { 
 
    if (node.Children) node.children = node.Children; 
 
    if (node.children) node.children = node.children.map(transform); 
 
    delete node.Children; 
 
    return node; 
 
} 
 

 

 
var json = { 
 
    "name": "a", 
 
    "Children": [{ 
 
    "age": 13, 
 
    "name": "b", 
 
    "Children": [{ 
 
     "name": "Mr Bob Chilren", 
 
     "Children": [] 
 
    }, { 
 
     "name": "d", 
 
     "age": 33, //other props keep 
 
     "children": [{ 
 
     "name": "already lowecased", 
 
     "age": 44, 
 
     "Children": [{ 
 
      "name": "now back to upercased", 
 
      "age": 99 
 
     }] 
 
     }] //what if were alrady lowercased? 
 
    }] 
 
    }, { 
 
    "name": "e", 
 
    //"Children": [] //what if we have no children 
 
    }] 
 
}; 
 

 
console.log(transform(json));