2016-11-25 3 views
3

나는 아주 간단한 json을 가졌지 만, 각 블록에서 나는 이와 같은 것을 얻었다.json 키의 반복 이름 바꾸기

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

이제 모든 "어린이"키를 소문자 "어린이"로 바꾸고 싶습니다. 다음 코드는 첫 번째 깊이에만 작동합니다. 어떻게 이것을 재귀 적으로 할 수 있습니까?

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

+3

아마도 해킹이 아니라 당신이 대답 한 후하지만 방법에 대한'VAR의 = JSON.stringify (JSON); var t = s.바꾸기 (/ "어린이"/ g, ""자녀 " '); var newJson = JSON.parse (t);'? – Bardy

+0

고맙다 @ 버디. 매력처럼 작동 – Elsendion

+0

야! 문제 없다! :) – Bardy

답변

2

가능한 해결 방법은

var s = JSON.stringify(json); 
var t = s.replace(/"Children"/g, '"children"'); 
var newJson = JSON.parse(t); 
  • 장점 :이 솔루션은 단지 세 라인 인, 매우 간단하다.
  • 단점 : 또한 것이다

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

이 솔루션은 "Children"모든 인스턴스를 대체하므로 favouriteWords 배열의 항목 :잠재적 원치 않는 부작용을 고려 있습니다 아니요,이더라도 속성 이름이 바뀌 었습니다. 속성 이름 이외의 다른 단어가 나타날 수있는 기회가 없으면 이는 문제가되지 않지만 경우에 따라 인상 할 가치가 있습니다.

3

꽤 잘 정의되어

0 :
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"); 
1

그것을 재귀 할 수있는 기능입니다 : 당신은 단순히 같은 재귀 함수를 만들 수 있도록

그것은 입력 구조를 보이는
0

허용되는 답변과 @Tamas 답변에 약간의 문제가 있습니다.

@ Bardy의 대답으로 지적했듯이 자녀의 단어 중 자녀가 문제를 일으킬만한 것이 있으면 문제가 있습니다.

@Tamas와 함께 한 가지 문제는 이름이 & 인 다른 모든 속성이 삭제된다는 것입니다. 또한 Children 속성을 가정합니다. 그리고 아이들 재산이 이미 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));