如何将对象 JSON 转换为 d3.js 数组数据

How to convert object JSON to a d3.js array data

我有以下 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 但没有成功。

您可以使用 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))

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