Tengo un objeto como este, hay muchas claves denominadas choices label
obj = { "label":"mylabel", "choices:[ { "label":"mylabel_11", "choices":{ "label":"mylabel_12", "choices":[...] } },{ "label":"mylabel_21", "choices":{ "label":"mylabel_22", "choices":[...] } }, ] }Ahora quiero cambiar todo "etiqueta" a "nombre", "opciones" a "niños"
¿Hay alguna forma recursiva de reemplazar el nombre?
Actualmente mi idea es
var new_keys; for (key in obj){ var old_key = key; key = key.replace("label","name"); key = key.replace("choices","children"); new_keys[key] = obj[old_key] }¿Cómo puedo hacer esto recursivo?
En mi humilde opinión, la forma más fácil sería usar string.replace. Todo el código en una línea
var obj=JSON.parse(JSON.stringify(obj).replaceAll("\"label\":","\"name\":") .replaceAll("\"choices\":","\"children\":"));resultado
{ "name": "mylabel", "children": [ { "name": "mylabel_11", "children": { "name": "mylabel_12", "children": [] } }, { "name": "mylabel_21", "children": { "name": "mylabel_22", "children": [] } } ] }Podría intentar usar la recursión de la siguiente manera, teniendo en cuenta que la declaración if explica el hecho de que las "opciones" de su objeto pueden ser una matriz o un objeto.
function replaceObject(yourObj) { if (yourObj.hasOwnProperty("label")) { if (Array.isArray(yourObj.choices)) { return { name: yourObj.label, children: yourObj.choices.map((choice) => { return replaceObject(choice); }), }; } else { return { name: yourObj.label, children: replaceObject(yourObj.choices), }; } } }Creo que está pidiendo una forma de hacer que penetre arbitrariamente en su objeto. Creo que esto podría funcionar:
function recursiveKeyRename(obj) { var new_keys; for (key in obj){ var old_key = key; key = key.replace("label","name"); key = key.replace("choices","children"); new_keys[key] = obj[old_key] }; if (obj.children && obj.children.choices) { recursiveKeyRename(obj.children.choices) }; };Realmente no he probado eso, y eso solo funciona si todas sus "opciones" son objetos, no matrices como usted (¿quizás?) Implicado en su ejemplo. Sin embargo, se puede modificar fácilmente para cualquier caso de uso.