Javascript递归规范化JSON数据
我有一个json响应,我想用递归和reduce来简化json数据。我写了一个函数,把我卡在这一点上。我想删除所有数据元素并创建一个没有数据名的新对象 我的json数据如下Javascript递归规范化JSON数据,javascript,json,recursion,reduce,Javascript,Json,Recursion,Reduce,我有一个json响应,我想用递归和reduce来简化json数据。我写了一个函数,把我卡在这一点上。我想删除所有数据元素并创建一个没有数据名的新对象 我的json数据如下 [ { "city": { "data": { "id": 649442, "country_id": 54, "state_id": 682, "ci
[
{
"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;
}, {});
};
此时,我仍在获取数据对象。那么我在哪里犯错呢。或者有更好的方法吗?这是一个没有
reduce()
的解决方案,它检查对象属性是否未被继承(hasOwnProperty()
),并对对象本身的每个属性进行递归。如果属性键是数据
,则所有值都会复制到父对象,然后从对象中删除数据
键。这就是问题的症结所在,因为data
对象本身可能有一个data
属性,因此必须对此进行检查,并且需要应用双递归
var jsonStr=`{
“城市”:{
“数据”:{
“id”:649442,
“国家id”:54,
“州id”:682,
“城市名称”:“布拉格”,
“州名称”:“普拉哈”
}
},
“国家”:{
“数据”:{
“id”:54,
“数据”:{
“国家名称”:“捷克共和国”,
“短国家”:“捷克”,
“奥林匹克规则”:“CZE”
}
}
}
}`;
var jo=JSON.parse(jsonStr);
函数规格化(obj){
for(obj中的var键){
if(对象hasOwnProperty(键)){
如果(对象的类型[键]=“对象”){
如果(键==‘数据’){
//检查数据对象是否也具有数据属性
if(obj[key].hasOwnProperty('data')){
//双重递归
规范化(obj[key]);
正常化(obj);
}
否则{
//将所有值复制到父级
//(仅当它们在父级中尚不存在时)
for(obj中的var子键[键]){
if(obj[key].hasOwnProperty(子键)
&&!obj.hasOwnProperty(子键)){
obj[subKey]=obj[key][subKey];
}
}
//删除数据键
删除obj[key];
}
}
否则{
//递归
规范化(obj[key]);
}
}
}
}
}
正常化(jo);
console.log(jo)代码>我发现了我的错误。我在对象的顶部有一个数组:),所以我修复了如下代码
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);
})
}
欢迎来到苏坦!为了清晰起见,您希望删除某些关键点并获得新的、已清理的对象。对吗?但是id=54的object应该怎么办呢?是的,我想避免使用类型数据,所以id:54应该是这样的{“country”:{“id”:54}。如果您能给出一个输入和预期输出的示例,那会有所帮助。谢谢。好的,这是一个解决方案,但也是一个高度复杂的函数:没有分离的关注点,几乎不可重用。@ftor是的,但使其可重用也不太难,是吗?