Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript递归规范化JSON数据_Javascript_Json_Recursion_Reduce - Fatal编程技术网

Javascript递归规范化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

我有一个json响应,我想用递归和reduce来简化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;
  }, {});
};

此时,我仍在获取数据对象。那么我在哪里犯错呢。或者有更好的方法吗?

这是一个没有
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是的,但使其可重用也不太难,是吗?