2017-01-16 106 views
4

我試圖重新映射以下類型格式的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

回答

3

你可以使用迭代和遞歸方法用於解決在哈希表中的結果陣列。

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

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) 
+0

你可以給一個不硬連線區號的版本嗎? – 2017-01-16 13:29:16

+0

這將是困難的,因爲代碼是在循環內部和提取,你必須迭代它... –

+0

嗯區號是動態的(他們是通過匹配的位置數據(lon /拉)與topoJSON文件包含區域代碼寫入該位置,之後我需要重新排序才能創建該數據的[Choropleth](http://bl.ocks.org/mbostock/4060606),所以我沒有預先了解區號... – Max