2016-09-30 3 views
0

json 응답이 있습니다.이 json 데이터를 재귀 및 단순화하여 단순화하고 싶습니다. 나는이 시점에서 붙어있는 함수를 쓴다. 모든 데이터 요소를 제거하고 데이터 이름없이 새 개체를 만들고 싶습니다.Javascript Recursion JSON 데이터를 정규화하십시오.

내 JSON 데이터는이

[ 
    { 
     "city": { 
      "data": { 
       "id": 649442, 
       "country_id": 54, 
       "state_id": 682, 
       "city_name": "Prague", 
       "state_name": "Praha" 
      } 
     }, 
     "country": { 
      "data": { 
       "id": 54, 
       "data": { 
        "country_name": "Czech Republic", 
        "short_country": "CZ", 
        "olympic_code": "CZE" 
       } 
      } 
     } 
    } 
] 

처럼 그리고 내 기능은 여기에 있습니다 : 상기

function normalizeData(object) { 
    return Object.keys(object).reduce((finalObject, objectKey) => { 
    if (object[objectKey] && object[objectKey].data) { 
     finalObject[objectKey] = object[objectKey].data; 
     if (Array.isArray(finalObject[objectKey].data)) { 
     finalObject[objectKey] = object[objectKey].data.map(item => { 
      return normalizeData(item); 
     }); 
     } else { 
     finalObject[objectKey] = normalizeData(object[objectKey].data); 
     } 
    } else { 
     finalObject[objectKey] = object[objectKey]; 
    } 
    return finalObject; 
    }, {}); 
}; 

나는 여전히 데이터 객체를 얻고있다. 그래서 내가 실수하고있어. 아니면 이것을 할 수있는 더 좋은 방법이 있습니까?

+0

SO Tan! 명확성을 위해 특정 키를 삭제하고 새롭고 치료 된 객체를 가져 오려고합니다. 권리? 그러나'id = 54'로 반대하는 것은 어떻게해야할까요? – Rajesh

+0

이 예, ID 그렇게 유형의 데이터를 피하고 싶은 : (54)이 같아야 { "국가": { "ID": 54 } } –

+0

은 입력의 예를 넣을 수 있다면 도움이 될 및 예상되는 출력. 감사. – acontell

답변

0

reduce()이없는 해결책으로, 개체 속성이 상속되지 않았는지 (hasOwnProperty()) 확인하고 개체 자체 인 각 속성에 대해 재귀를 수행합니다. 속성 키가 data이면 부모 개체에 모든 값이 복사되고 나중에 data 키가 개체에서 삭제됩니다. 이것은 data 객체가 data 속성을 가질 수 있기 때문에 까다로운 곳입니다. 따라서이 속성을 검사해야하며 이중 재귀가 적용되어야합니다.

var jsonStr = `{ 
 
    "city": { 
 
     "data": { 
 
      "id": 649442, 
 
      "country_id": 54, 
 
      "state_id": 682, 
 
      "city_name": "Prague", 
 
      "state_name": "Praha" 
 
     } 
 
    }, 
 
    "country": { 
 
     "data": { 
 
      "id": 54, 
 
      "data": { 
 
       "country_name": "Czech Republic", 
 
       "short_country": "CZ", 
 
       "olympic_code": "CZE" 
 
      } 
 
     } 
 
    } 
 
}`; 
 

 
var jo = JSON.parse(jsonStr); 
 

 
function normalize(obj) { 
 
    for (var key in obj) { 
 
     if (obj.hasOwnProperty(key)) { 
 
      if (typeof obj[key] === 'object') { 
 
       if (key === 'data') { 
 
        // check if data object also has a data property 
 
        if (obj[key].hasOwnProperty('data')) { 
 
         // double recursion 
 
         normalize(obj[key]); 
 
         normalize(obj); 
 
        } 
 
        else { 
 
         // copy all values to the parent 
 
         // (only if they don't exist in the parent yet) 
 
         for (var subKey in obj[key]) { 
 
          if (obj[key].hasOwnProperty(subKey) 
 
          && !obj.hasOwnProperty(subKey)) { 
 
           obj[subKey] = obj[key][subKey]; 
 
          } 
 
         } 
 
         // remove the data key 
 
         delete obj[key]; 
 
        } 
 
       } 
 
       else { 
 
        // recursion 
 
        normalize(obj[key]); 
 
       } 
 
      } 
 
     } 
 
    } 
 
} 
 

 
normalize(jo); 
 

 
console.log(jo);

당신은 당신이 기능은 입력을 수정하지 않는 경우, 하나를 먼저 객체의 복사본을 만들고 반환하는 deep extend를 사용할 수 있습니다.

+0

고마워, 잘 했어. –

+1

OK, 솔루션이지만 매우 복잡한 함수입니다. 걱정할 필요가없고 재사용이 쉽지 않습니다. – ftor

+0

@ftor 예, 그렇습니다. 그러나 재사용이 가능하기도 어렵지 않습니까? –

0

내 실수를 발견했습니다. 객체의 맨 위에 배열이 있습니다. :) 그래서이 코드를 수정했습니다.

export function normalizeData(object) { 
    return Object.keys(object).reduce((finalObject, objectKey) => { 
    if (object[objectKey] && object[objectKey].data) { 
     finalObject[objectKey] = object[objectKey].data; 
     if (Array.isArray(finalObject[objectKey].data)) { 
     finalObject[objectKey] = object[objectKey].data.map(item => { 
      return normalizeData(item); 
     }); 
     } else { 
     finalObject[objectKey] = normalizeData(object[objectKey].data); 
     } 
    } else { 
     finalObject[objectKey] = object[objectKey]; 
    } 
    return finalObject; 
    }, {}); 
} 

export function normalizeArray(array) { 
    return array.map(object => { 
    return normalizeData(object); 
    }) 
} 
관련 문제