Как преобразовать объект 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, но безуспешно.

2 ответа

Решение

Вы можете сделать это с Object.keys() а также forEach() to loop object and add to array.

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);

Другие вопросы по тегам