Невозможно сделать текст JSON из объекта javascript

1

Я хотел бы преобразовать этот объект, который я получаю с сервера, в файл 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. Поэтому оцените ваши намеки.

  • 0
    console.log(JSON.stringify(object));
  • 0
    @CertainPerformance извините, я исправил опечатку.
Показать ещё 5 комментариев
Теги:

7 ответов

2
Лучший ответ

Вы можете использовать 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);
  • 0
    Почему бы просто не использовать for (key in data) ? В качестве бонуса это также будет работать для не перечисляемых объектов.
2

Вы почти там (массив отформатирован правильно), но для этого результирующего массива нужен значение 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);
  • 0
    Приятно! Просто нужно, чтобы значения были int .
2

Предполагая, что вы вручную добавляете ключ, подобный 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}]}
  • 0
    @Babr как насчет этого?
1

Вы можете просто перебирать объект 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))
1

Вы могли бы сделать что-то вроде этого

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

Это более чистый способ получить желаемые результаты на мой взгляд

1

Создайте объект с 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)
1

Попробуйте - console.log(JSON.stringify(jsonText))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню