将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 /节点,并寻找一个办法做到这一点更优雅比手工遍历所有对象和重组他们。 正在调查reorient和obstruction,但无法找到把它做的方式....
任何帮助表示赞赏!
我知道上面的部分是从文件中读取然后解析为对象的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));
你可以使用迭代和递归方法用于解决在哈希表中的结果阵列。
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; }
在代码片段上它确实完美无缺地工作,谢谢! 在导入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
@Max,你可以首先用'Array.isArray(data [key])'检查'data [key]',它是数组 –
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)
你可以给一个不硬连线区号的版本吗? – 2017-01-16 13:29:16
这将是困难的,因为代码是在循环内部和提取,你必须迭代它... –
嗯区号是动态的(他们是通过匹配的位置数据(lon /拉)与topoJSON文件包含区域代码写入该位置,之后我需要重新排序才能创建该数据的[Choropleth](http://bl.ocks.org/mbostock/4060606),所以我没有预先了解区号... – Max
你可以添加你的代码。请看看这里:[mcve] –
我可以建议使用[javascript linq](https://linqjs.codeplex.com/) –
请看看这个:http://benalman.com/news/2010/ 03/theres-no-such-thing-as-a-json/ – 2017-01-16 13:28:46