Как преобразовать объект 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);