2017-04-13 62 views
0

我在JSON格式以下數據集,我要轉換的東西,我可以在d3.js一起工作:如何JSON對象轉換爲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 
     } 
    } 

我有3個等級根據其對d1,d2和d3進行排名的類型。現在,我想將其轉換爲以下格式:

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

原因是,當我登錄d3.csv函數的輸出,它有一個類似的格式。也就是說,它是一個對象數組,第一個對象的鍵被轉換爲輸出數組中的值。

我曾嘗試玩Object.entries,Object.keys,Object.values但沒有成功。

回答

1

你可以用Object.keys()forEach()來做到這一點,以循環對象並添加到數組。

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

太好了,謝謝。 雖然,坦率地說,我期待得到一個「一行」:)沒想到它會那麼複雜。 – Ahmedov

1

可能的解決方法使用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);