2017-01-16 4 views
4

Я пытаюсь переназначить следующую структуру JSON, которая отформатирована по категориям, а затем для каждой категории может содержать несколько местоположений. В местах содержат долготу/Lat и код города: Объект Remap 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)); 
+2

Вы можете добавить свой код. пожалуйста, посмотрите здесь: [mcve] –

+0

Я мог бы предложить использовать [javascript linq] (https://linqjs.codeplex.com/) –

+0

Пожалуйста, взгляните на это: http://benalman.com/news/2010/ 03/theres-no-such-thing-as-a-json/ –

ответ

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 и разбор его, хотя, это ошибки из с 'данных [ключ] .forEach (функция (а) { ^ TypeError: данные [ключ] .forEach не является функцией в Object.keys .forEach._ (/Users/mwesten/source/tekenradar/temp.js:30:17) в Array.forEach (native) ' [Файл, используемый для импорта из] (http: //f.dlmax. org/y2016-gm/y2016-gm.json) – Max

+1

@Max, вы можете проверить 'data [key]' с 'Array.isArray (data [key])' сначала, это массив. –

+0

Спасибо;), что исправлено Это ! – Max

0

try this

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

Можете ли вы дать версию, которая не жестко привязывает коды областей? –

+0

было бы сложно, потому что код находится внутри цикла и для получения того, что вы должны его итерации ... –

+0

Хммм, коды областей динамические (они найдены путем сопоставления данных местоположения (lon/lat) с файлом topoJSON, содержащим которые затем записываются в это место. После этого мне нужно изменить порядок вещей, чтобы создать [Choropleth] (http://bl.ocks.org/mbostock/4060606) этих данных, поэтому я не знайте коды области вверх ... – Max

Смежные вопросы