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

我试图重新映射以下types格式的JSON结构,然后每个类别可以包含多个位置。 一个位置包含一个lon / lat和一个区号:

{ "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"} } ] } 

在以下结构中,主要关注区域代码,然后是具有实际位置的类别。

 { "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 / Node中做到这一点,并正在寻找一种方法来做到这一点比手动遍历所有对象,并重构它们更优雅。 正在调查重新定向和阻碍,但无法find一个方法来完成….

任何帮助表示赞赏!

我知道上面的片断是从文件读取,然后parsing到一个对象的JSONstring。

我现在要做的代码是(没完成,因为我不知道做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)); 

您可以使用迭代和recursion方法来处理散列表中的结果数组。

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

尝试这个

 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)