将JSON对象重新映射到其他JSON结构

将JSON对象重新映射到其他JSON结构

问题描述:

我试图重新映射以下类型格式的JSON结构,然后每个类别可以包含多个位置。甲位置包含一个经度/纬度和区号: 将JSON对象重新映射到其他JSON结构

{ 
    "cat1":[ 
    {"location":{ 
     "latitude":51.38, 
     "longitude":4.34, 
     "code":"0873"} 
    }, 
    {"location":{ 
     "latitude":52.65, 
     "longitude":6.74, 
     "code":"0109"} 
    }, 
    {"location":{ 
     "latitude":51.48, 
     "longitude":4.33, 
     "code":"0748"} 
    }, 
    {"location":{ 
     "latitude":51.48, 
     "longitude":4.33, 
     "code":"0109"} 
    } 
    ], 
    "cat2":[ 
    {"location":{ 
     "latitude":52.33, 
     "longitude":4.32, 
     "code":"0873"} 
    }, 
    {"location":{ 
     "latitude":52.65, 
     "longitude":6.74, 
     "code":"0109"} 
    }, 
    {"location":{ 
     "latitude":51.48, 
     "longitude":4.33, 
     "code":"0728"} 
    } 
    ], 
    "cat3":[ 
    {"location":{ 
     "latitude":52.33, 
     "longitude":4.32, 
     "code":"0873"} 
    }, 
    {"location":{ 
     "latitude":52.65, 
     "longitude":6.74, 
     "code":"0109"} 
    }, 
    {"location":{ 
     "latitude":51.48, 
     "longitude":4.33, 
     "code":"0758"} 
    } 
    ] 
} 

成以下结构,即是主要集中于AREACODE,然后与在它们的实际位置的类别。

{ 
    "code":[ 
    {"0873":[ 
     {"cat1":[ 
     {"location":{"latitude":51.38,"longitude":4.34}} 
     ]}, 
     {"cat2":[ 
     {"location":{"latitude":52.33,"longitude":4.32}} 
     ]}, 
     {"cat3":[ 
     {"location":{"latitude":52.33,"longitude":4.32}} 
     ]} 
    ]}, 

    {"0109":[ 
     {"cat1":[ 
     {"location":{"latitude":52.65,"longitude":6.74}}, 
     {"location":{"latitude":51.48,"longitude":4.33}} 
     ]}, 
     {"cat2":[ 
     {"location":{"latitude":52.65,"longitude":6.74}} 
     ]}, 
     {"cat3":[ 
     {"location":{"latitude":52.65,"longitude":6.74}} 
     ]} 

    ]}, 
    {"0748":[ 
     {"cat1":[ 
     {"location":{"latitude":51.48,"longitude":4.33}} 
     ]} 
    ]}, 

    {"0728":[ 
     {"cat2":[ 
     {"location":{"latitude":51.48,"longitude":4.33}} 
     ]} 
    ]}, 
    {"0758":[ 
     {"cat3":[ 
     {"location":{"latitude":51.48,"longitude":4.33}} 
     ]} 
    ]} 

    ] 
} 

我尝试做这在Javascript /节点,并寻找一个办法做到这一点更优雅比手工遍历所有对象和重组他们。 正在调查reorientobstruction,但无法找到把它做的方式....

任何帮助表示赞赏!

我知道上面的部分是从文件中读取然后解析为对象的JSON字符串。

我必须做的,这是目前的代码(它没有完成,因为我不知道什么是做remapJson()的最佳方式:

var fs = require('fs'), 
jsonfile = require('jsonfile'); 

function remapJson(oldData) { 
    var newData = {}; 

    // Do the convertion (loop all keys and values?) 


    return newData 
} 

obj = jsonfile.readFileSync('oldstructure.json'); 

jsonfile.writeFileSync('newstructure.json', remapJson(obj)); 
+2

你可以添加你的代码。请看看这里:[mcve] –

+0

我可以建议使用[javascript linq](https://linqjs.codeplex.com/) –

+0

请看看这个:http://benalman.com/news/2010/ 03/theres-no-such-thing-as-a-json/ – 2017-01-16 13:28:46

你可以使用迭代和递归方法用于解决在哈希表中的结果阵列。

var data = { cat1: [{ location: { latitude: 51.38, longitude: 4.34, code: "0873" } }, { location: { latitude: 52.65, longitude: 6.74, code: "0109" } }, { location: { latitude: 51.48, longitude: 4.33, code: "0748" } }, { location: { latitude: 51.48, longitude: 4.33, code: "0109" } }], cat2: [{ location: { latitude: 52.33, longitude: 4.32, code: "0873" } }, { location: { latitude: 52.65, longitude: 6.74, code: "0109" } }, { location: { latitude: 51.48, longitude: 4.33, code: "0728" } }], cat3: [{ location: { latitude: 52.33, longitude: 4.32, code: "0873" } }, { location: { latitude: 52.65, longitude: 6.74, code: "0109" } }, { location: { latitude: 51.48, longitude: 4.33, code: "0758" } }] }, 
 
    result = { code: [] }; 
 

 
Object.keys(data).forEach(function (key) { 
 
    data[key].forEach(function (a) { 
 
     [a.location.code, key].reduce(function (r, k) { 
 
      var o = {}; 
 
      if (!r[k]) { 
 
       r[k] = { _: [] }; 
 
       o[k] = r[k]._; 
 
       r._.push(o); 
 
      } 
 
      return r[k]; 
 
     }, this)._.push({ location: { latitude: a.location.latitude, longitude: a.location.longitude } }); 
 
    }, this); 
 
}, { _: result.code }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

在代码片段上它确实完美无缺地工作,谢谢! 在导入json文件并解析它时,数据[key] .forEach(function(a){ ^ ^ TypeError:data [key] .forEach在Object.keys中不是函数 .forEach._(/Users/mwesten/source/tekenradar/temp.js:30:17) at Array.forEach(native)' [用于导入的文件](http://f.dlmax。 org/y2016-gm/y2016-gm.json) – Max

+1

@Max,你可以首先用'Array.isArray(data [key])'检查'data [key]',它是数组 –

+0

Thanks;)that fixed它! – Max

试试这个

var a = //your json 
var newArray = []; 
for(var i in a){ 
    var obj = {}; 
    var newobj = {}; 
    var innerobj = {}; 
    var locationobj = {}; 
    if(a[i].length != 0){ 
     var keyname = i; 
     for(var j = 0;j<a[i].length ; j++){ 
      if(a[i][j].location.code == "0873"){ 
       locationobj["latitude"] = a[i][j].location.latitude; 
       locationobj["longitude"] = a[i][j].location.longitude; 
       innerobj[i] = {"loaction":locationobj}; 
       obj[a[i][j].location.code] = innerobj; 
       newArray.push({"code":obj}) 
      }else if(a[i][j].location.code == "0758"){ 
       locationobj["latitude"] = a[i][j].location.latitude; 
       locationobj["longitude"] = a[i][j].location.longitude; 
       innerobj[i] = {"loaction":locationobj}; 
       obj[a[i][j].location.code] = innerobj; 
       newArray.push({"code":obj}) 
      }else if(a[i][j].location.code == "0109"){ 
       locationobj["latitude"] = a[i][j].location.latitude; 
       locationobj["longitude"] = a[i][j].location.longitude; 
       innerobj[i] = {"loaction":locationobj}; 
       obj[a[i][j].location.code] = innerobj; 
       newArray.push({"code":obj}) 
      } 

     } 
    } 
} 

console.log(newArray) 
+0

你可以给一个不硬连线区号的版本吗? – 2017-01-16 13:29:16

+0

这将是困难的,因为代码是在循环内部和提取,你必须迭代它... –

+0

嗯区号是动态的(他们是通过匹配的位置数据(lon /拉)与topoJSON文件包含区域代码写入该位置,之后我需要重新排序才能创建该数据的[Choropleth](http://bl.ocks.org/mbostock/4060606),所以我没有预先了解区号... – Max