Я хотел бы преобразовать этот объект, который я получаю с сервера, в файл JSON, чтобы использовать его в диаграмме d3.js:
data = {
"dog ":"5",
"cat ":"4",
"fish ":"12",
}
Выход должен быть:
{
"name" : "animal",
"children" : [
{"name":"dog", "value": 5},
{"name":"cat", "value": 4},
{"name":"fish", "value": 10}
]
}
Я придумал:
var jsonText = [] ;
for ( key in data) {
jsonText.push({name : key.trim(), value : parseInt(data[key])});
}
Но когда я пытаюсь распечатать объект, я получаю:
[object Object],[object Object],[object Object]
В дополнение к этому я не знаю, как добавить другие атрибуты в файл JSON. Поэтому оцените ваши намеки.
Вы можете использовать Object.keys(data)
и Object.keys(data)
key
чтобы получить желаемую структуру объекта.
var data = {
"dog ":"5",
"cat ":"4",
"fish ":"12",
};
var res = {
name: "animal",
children: []
};
Object.keys(data).forEach((key)=>{
res.children.push(
{name:key.trim(), value: parseInt(data[key])}
);
});
console.log(res);
for (key in data)
? В качестве бонуса это также будет работать для не перечисляемых объектов.
Вы почти там (массив отформатирован правильно), но для этого результирующего массива нужен значение children
свойства объекта. Было бы также немного проще использовать Object.entries
и map
, которые преобразуют массив в другой массив на основе тех же элементов:
const data = {
"dog ":"5",
"cat ":"4",
"fish ":"12",
};
const children = Object.entries(data)
.map(([name, value]) => ({ name: name.trim(), value: Number(value) }));
const output = { name: 'animal', children };
console.log(output);
int
.
Предполагая, что вы вручную добавляете ключ, подобный animal
это должно работать, и значения должны быть ints.
var data = {
"dog ":"5",
"cat ":"4",
"fish ":"12",
}
var children = Object.keys(data).map((key) => {
return {
name: key.trim(),
value: parseInt(data[key])
}
})
let result = JSON.stringify({
name: 'animal',
children
})
console.log(result);
Это вернет
{"name":"animal","children":[{"name":"dog ","value":5},{"name":"cat ","value":4},{"name":"fish ","value":12}]}
Вы можете просто перебирать объект data
используя for..in
и push prop: value
pair objects в массив children
:
const data = {
"dog ": "5",
"cat ": "4",
"fish ": "12",
}
let obj = {
name: "animal",
children: []
}
for (prop in data) {
let animal = {}
animal[prop.trim()] = Number(data[prop])
obj.children.push(animal)
}
console.log(JSON.stringify(obj))
Вы могли бы сделать что-то вроде этого
const data = {
"dog ":"5",
"cat ":"4",
"fish ":"12",
}
Object.keys(data).reduce((obj, animal) => ({
...obj,
children: [
...obj.children,
{
name: animal,
value: data[animal]
}
]
}), {name: "animal", children: []})
console.log(JSON.stringify(obj))
Это более чистый способ получить желаемые результаты на мой взгляд
Создайте объект с children
ключом и нажмите на него значение
let data = {
"dog ": "5",
"cat ": "4",
"fish ": "12",
}
let newObj = {
"name": "animal",
"children": []
}
for (let keys in data) {
newObj.children.push({
name: keys.trim(),
value: parseInt(data[keys], 10)
});
}
console.log(newObj)
Попробуйте - console.log(JSON.stringify(jsonText))
console.log(JSON.stringify(object));