2017-10-19 23 views
0

Je rencontre des difficultés pour transformer certaines données CSV en un format acceptable par le diagramme de zone empilée NVD3 (exemple de données présentées ici: http://nvd3.org/examples/stackedAreaData.json). J'ai actuellement un tableau d'objets dont les valeurs sont des paires d'objets clé-valeur, mais j'ai besoin de le transformer en un tableau d'objets dont les valeurs sont un tableau de tableaux.Convertir un sous-tableau d'objets avec paires clé-valeur en tableau de tableaux

à quoi il ressemble maintenant:

[{"key":"path1","values":[{"key":1,"value": x},{"key":2,"value": y},{"key":3,"value": z}]},{"key":"path2","values":[{"key":1,"value": a},{"key":1,"value": b},{"key":1,"value": c}]}] 

Comment le résultat:

[{"key":"path1","values":[[1,x],[2,y],[3,z]]},{"key":"path2","values":[[1,a],[2,b],[3,c]]}] 

En d'autres termes, je dois changer les « valeurs » dans chaque objet correspondant à un « chemin » (chemin1, chemin2, etc.) d'un tableau d'objets dans un tableau de tableaux (qui sont juste les valeurs des propriétés d'objet "clé" et "valeur".)

Mon code actuel est affiché ici:

d3.csv("http://monicawojciechowski.github.io/pathtoplayoff/full_data.csv", function(d) { 
    return { 
    path: +d.path, 
    week: +d.week, 
    playoff: +d.playoff, 
    tm: d.tm, 
    conf: d.conf, 
    div: d.div, 
    conf_div: d.conf_div 
    }; 
    }, 

    function(data) { 
    var rawdata = data; 
    console.log(rawdata); 

var databypath_rollup = d3.nest() 
.key(function(d) {return +d.path; }).sortKeys((a, b) => d3.ascending(+a, +b)) 
.key(function(d) {return +d.week; }).sortKeys((a, b) => d3.ascending(+a, +b)) 
.rollup(function(leaves) {return d3.sum(leaves, function(d) {return parseFloat(d.playoff);})}) 
.entries(rawdata); 
console.log(databypath_rollup); 

Lorsque je tente de modifier le tableau d'objets à un tableau de tableaux, en procédant comme suit:

var arrayformat = databypath_rollup.map(function(obj) { 
    return Object.keys(obj).sort().map(function(key) { 
    return obj[key]; 
    }); 
}); 
console.log(arrayformat); 

Je change par erreur le tableau extérieur d'objets dans un tableau de tableaux. Je veux garder le plus haut niveau de paires clé-valeur, tout en changeant le sous-niveau en [1, y] (vs {"clé": 1, "valeur": y})

Des pensées?

Répondre

0

On dirait une utilisation parfaite de Array.prototype.reduce()

On dirait que vous utilisez ES5, alors voici ce que cela ressemblerait comme ES5

let res1 = items.reduce(function(acc, item){ 
    return acc.concat({ 
    "key": item.key, 
    "values": item.values.map(function(value) { return [value.key, value.value] }) 
    }) 
}, []); 

Et voici ce que cela ressemblerait comme ES6

let res2 = items.reduce((acc, item) => { 
    return acc.concat({ 
    "key": item.key, 
    "values": item.values.map((value) => [value.key, value.value]) 
    }) 
}, []); 

les deux ci-dessus utilise ce tableau (qui fixe une erreur de syntaxe dans l'échantillon) ...

let items = [{ "key": "path1", "values": [{ "key": 1, "value": "x" }, { "key": 2, "value": "y" }, { "key": 3, "value": "z" }] }, { "key": "path2", "values": [{ "key": 1, "value": "a" }, { "key": 1, "value": "b" }, { "key": 1, "value": "c" }] }]; 

J'ai installé un rempl sur repl.it ici ... https://repl.it/MsQu

+0

Merci Chris - cette solution fonctionne très bien et m'a sauvé des maux de tête beaucoup d'avenir! Vous avez raison d'utiliser ES5, mais je vous remercie de partager la solution pour ES6. – monw

+0

content d'entendre ça! bonne chance –