Masinde Muliro
Masinde Muliro

Reputation: 1183

Javascript and Arrays

This i have to admin has always been my Achilles tendon despite my years of experience in programming.

I have a json result looking like this from which I want to draw a time series using highcharts.com

[{"iso-2":"DE","year":"2000","value":"0"},{"iso-2":"FR","year":"2000","value":"0"},{"iso-2":"KE","year":"2000","value":"0"},{"iso-2":"DE","year":"2001","value":"0"},{"iso-2":"FR","year":"2001","value":"0"},{"iso-2":"KE","year":"2001","value":"0"},{"iso-2":"DE","year":"2002","value":"0"},{"iso-2":"FR","year":"2002","value":"0"},{"iso-2":"KE","year":"2002","value":"0"},{"iso-2":"DE","year":"2003","value":"9355"},{"iso-2":"FR","year":"2003","value":"19490"},{"iso-2":"KE","year":"2003","value":"0"},{"iso-2":"DE","year":"2004","value":"0"},{"iso-2":"FR","year":"2004","value":"0"},{"iso-2":"KE","year":"2004","value":"0"},{"iso-2":"DE","year":"2005","value":"11"},{"iso-2":"FR","year":"2005","value":"8"},{"iso-2":"KE","year":"2005","value":"0"},{"iso-2":"DE","year":"2006","value":"2"},{"iso-2":"FR","year":"2006","value":"1388"},{"iso-2":"KE","year":"2006","value":"0"},{"iso-2":"DE","year":"2007","value":"0"},{"iso-2":"FR","year":"2007","value":"0"},{"iso-2":"KE","year":"2007","value":"0"}]

I'd like to dynamically generate the above result into an arrays that looks like this

series: [{
            name: 'KE',
            data: [0,0,0,0,0,0,0,0]
        }, {
            name: 'FR',
            data: [0,0,0,19490,0,8,1388,0]
        }, {
            name: 'DE',
            data: [0,0,0,9355,0,2,0]
        }]

Thank you so much for looking into this

Upvotes: 0

Views: 70

Answers (2)

Frax
Frax

Reputation: 3093

Here's what I can think of, considering the data you have in the JSON is sorted by year:

var json_data = '[{"iso-2":"DE","year":"2000","value":"0"},...]'; // This is the json data you have.
var data = JSON.parse(json_data); // Convert JSON data to javascript object or array

// Organize the data in an object
var organized = {};

data.forEach(function (item){
    if (typeof organized[item['iso-2']] !== 'undefined'){
        organized[item['iso-2']].push(item['value']);
    } else {
        organized[item['iso-2']] = [item['value']];
    }
});

// Convert the object to the format you need
var series = [];

for (i in organized){
    series.push({
        name: i,
        data: organized[i]
    });
}

Upvotes: 1

thefourtheye
thefourtheye

Reputation: 239473

var gathered = data.reduce(function(prev, curr) {
    if (prev.hasOwnProperty(curr["iso-2"])) {
        prev[curr["iso-2"]].push(parseInt(curr["value"]));
    } else {
        prev[curr["iso-2"]] = [parseInt(curr["value"])];
    }
    return prev;
}, {});

var result = [];
for (var country in gathered) {
    var obj = {};
    obj["name"] = country;
    obj["data"] = gathered[country];
    result.push(obj);
}

console.log(result);

Output

[ { name: 'DE', data: [ 0, 0, 0, 9355, 0, 11, 2, 0 ] },
  { name: 'FR', data: [ 0, 0, 0, 19490, 0, 8, 1388, 0 ] },
  { name: 'KE', data: [ 0, 0, 0, 0, 0, 0, 0, 0 ] } ]

Upvotes: 2

Related Questions