2017-04-13 3 views
0

Ich habe die folgenden Daten-Set im JSON-Format konvertieren, das ich etwas konvertieren möchte ich mit in d3.js arbeiten können:Wie Objekt JSON zu einer d3.js Arraydaten

{ 
     "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 
     } 
    } 

Ich habe 3 Rang Typen, nach denen d1, d2 und d3 geordnet sind. Jetzt will ich es auf das folgende Format konvertieren:

[ 
    { 
    "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 
    } 
] 

Der Grund dafür ist, dass, wenn ich die Ausgabe von d3.csv Funktion einzuloggen, es ein ähnliches Format hat. Das heißt, es handelt sich um ein Array von Objekten, und die Schlüssel aus dem ersten Objekt werden in die Werte im Ausgabe-Array konvertiert.

Ich habe versucht, mit Object.entries, Object.keys, Object.values ​​zu spielen, aber ohne Erfolg.

Antwort

1

Sie können dies mit Object.keys() und forEach() Schleife Objekt und zum Array hinzufügen.

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

super, danke. Obwohl, um ehrlich zu sein, ich hatte erwartet, einen "One-Liner" zu bekommen :) Ich habe nicht erwartet, dass es so kompliziert ist. – Ahmedov

1

Mögliche Lösung mit 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);