2017-04-13 90 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);