2016-11-25 3 views
3

У меня очень простой json, но в каждом блоке у меня что-то вроде этого.Rename json keys iterative

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

И так далее. Я не знаю, сколько детей есть внутри каждого ребенка рекурсивно.

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; 
} 

И теперь я хочу заменить все клавиши «Дети» строчными «детьми». Следующий код работает только для первой глубины. Как я могу сделать это рекурсивно?

+3

Может хак, а не ответ вы после, но как насчет: 'Var S = JSON.stringify (JSON); var t = s.заменить (/ «Дети»/g, «дети»); var newJson = JSON.parse (t); '? – Bardy

+0

Спасибо @ Барди. работал как шарм – Elsendion

+0

Yay! нет проблем! :) – Bardy

ответ

2

Возможное решение:

var s = JSON.stringify(json); 
var t = s.replace(/"Children"/g, '"children"'); 
var newJson = JSON.parse(t); 
  • Pros: Это решение очень простое, будучи всего лишь три линии.
  • Минусы: Там является потенциал нежелательный побочный эффект, рассмотрим:

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

Решение заменяет все экземпляры "Children", поэтому запись в favouriteWords массиве также быть заменен, несмотря на то, что не является, являющимся именем собственности. Если нет шансов на то, что слово появится где-либо еще, кроме как имя свойства, то это не проблема, но стоит на всякий случай подняться.

3

Это выглядит структура ввода достаточно хорошо определены, так что вы можете просто создать рекурсивную функцию следующим образом:

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

Вот функция, которая может сделать это recursivly:

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; 
     } 
    } 
} 

А вот более общий способ сделать это:

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

Как принятый ответ, так и ответ @Tamas имеют небольшие проблемы.

С ответом @ Барди, как он указывает, есть проблема, если в каком-либо из ваших значений было слово «Дети», это вызовет проблемы.

С @Tamas одна проблема заключается в том, что любые другие свойства, кроме имени &, получают детей. Также он предполагает свойство «Дети». А что, если у детей уже children, а не Children.

Используя слегка измененную версию @Tamas, это должно избегать подводных камней.

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));