2017-04-13 2 views
0

Je l'ensemble de données suivant au format JSON que je veux convertir en quelque chose que je peux travailler dans d3.js:Comment convertir JSON objet à une donnée de tableau d3.js

{ 
     "rank_type_1":{ 
      "d1":0, 
      "d2":1, 
      "d3":2 
     }, 
     "rank_type_2":{ 
      "d1":1, 
      "d2":0, 
      "d3":2 
     }, 
     "rank_type_3":{ 
      "d1":2, 
      "d2":0, 
      "d3":1 
     } 
    } 

J'ai 3 rang types selon lesquels d1, d2 et d3 sont classés. Maintenant, je veux convertir au format suivant:

[ 
    { 
    "id":d1 
    "rank_type_1" :0 
    "rank_type_2" :1 
    "rank_type_3" :2 
    }, 
    { 
    "id":d2 
    "rank_type_1" :1 
    "rank_type_2" :0 
    "rank_type_3" :2 
    }, 
    { 
    "id":d3 
    "rank_type_1" :2 
    "rank_type_2" :2 
    "rank_type_3" :1 
    } 
] 

La raison en est que lorsque je me connecte la sortie de d3.csv fonction, il a un format similaire. C'est-à-dire qu'il s'agit d'un tableau d'objets et que les clés du premier objet sont converties en valeurs dans le tableau de sortie.

J'ai essayé de jouer avec Object.entries, Object.keys, Object.values ​​mais sans succès.

Répondre

1

Vous pouvez le faire avec Object.keys() et forEach() pour boucler l'objet et l'ajouter au tableau.

var data = {"rank_type_1":{"d1":0,"d2":1,"d3":2},"rank_type_2":{"d1":1,"d2":0,"d3":2},"rank_type_3":{"d1":2,"d2":0,"d3":1}} 
 

 
var result = []; 
 
Object.keys(data).forEach(function(e) { 
 
    var that = this; 
 
    Object.keys(data[e]).forEach(function(a) { 
 
    if(!that[a]) { 
 
     that[a] = {id: a, [e]: data[e][a]} 
 
     result.push(that[a]) 
 
    } else { 
 
     Object.assign(that[a], {[e]: data[e][a]}) 
 
    } 
 
    }) 
 
}, {}) 
 

 
console.log(JSON.stringify(result, 0, 4))

+0

grand, merci. Bien que, franchement parlant, je m'attendais à avoir un "one-liner" :) Je ne m'attendais pas à être si compliqué. – Ahmedov

1

Solution possible en utilisant Array#reduce.

var obj = {"rank_type_1":{"d1":0,"d2":1,"d3":2},"rank_type_2":{"d1":1,"d2":0,"d3":2},"rank_type_3":{"d1":2,"d2":0,"d3":1}}, 
 
    res = Object.keys(obj).reduce(function(s,a,i) { 
 
     var r = Object.keys(obj[a]).map((v, x) => ({["rank_type_"+[x+1]] : obj[a][v]})); 
 
     s.push(Object.assign({}, {id : "d"+(i+1)}, ...r)); 
 
     return s; 
 
    }, []); 
 

 
    console.log(res);