Создание данных серии для HighCharts на основе JSON - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь объединить данные для столбчатой ​​диаграммы HighCharts на основе следующего JSON. Данные в каждой группе различны, и HighCharts требует, чтобы их данные по оси Y имели 0, если для соответствующей серии X нет данных. Для начала у меня есть следующее JSON:

{
    "groups": {
        "1567310400000": [
            {
                "groupName": "Fruits",
                "documentCount": 5
            }
        ],
        "1569902400000": [
            {
                "groupName": "Fruits",
                "documentCount": 1
            },
            {
                "groupName": "Desserts",
                "documentCount": 5
            },
            {
                "groupName": "Vegetables",
                "documentCount": 6
            }
        ]
    }
}

Желаемый результат: Я хотел бы создать отсортированный массив объектов из приведенных выше данных, например так:

[{
    name: 'Desserts',
    data: [0, 5]
}, {
    name: 'Fruits',
    data: [5, 1]
}, {
    name: 'Vegetables',
    data: [0, 6]
}]

У меня пока есть следующий код:

const chartXAxisData = [];
const chartYAxisData = [];
const names = [];
const doccounts = [];

for (const key in data.groups) {
  chartXAxisData.push(formatDate(key, 'MMM dd, yyyy', 'en-US', 'GMT').toString());

  for (let i = 0; i < data.groups[key].length; i++) {
    const groupname = data.groups[key][i].groupName;
    const doccount = data.groups[key][i].documentCount;
    if ( names.includes(groupname)) {
      doccounts[names.indexOf(groupname)].push(doccount);
    } else {
      names.push(groupname);
      doccounts.push([doccount]);
    }
}}

for (const name in names) {
   chartYAxisData.push({
     name: names[name],
     data: doccounts[name]
   });
}

Это дает следующий вывод вместо желаемого вывода:

[{
    name: 'Desserts',
    data: [5]
}, {
    name: 'Fruits',
    data: [5, 1]
}, {
    name: 'Vegetables',
    data: [6]
}]

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

1 Ответ

0 голосов
/ 18 марта 2020

Одним из способов было бы использование знакомого словаря с groupName в качестве ключа. Проверьте этот код, который я сделал для вас,

const data = {
  groups: {
    "1567310400000": [
      {
        groupName: "Fruits",
        documentCount: 5
      }
    ],
    "1569902400000": [
      {
        groupName: "Fruits",
        documentCount: 1
      },
      {
        groupName: "Desserts",
        documentCount: 5
      },
      {
        groupName: "Vegetables",
        documentCount: 6
      }
    ]
  }
};
const keys = Object.keys(data.groups);
const dic = {};
for (let k = 0; k < keys.length; k++) {
  for (const group of data.groups[keys[k]]) {
    const groupName = group.groupName;
    const documentCount = group.documentCount;
    if (!dic.hasOwnProperty(groupName)) {
      dic[groupName] = {
        groupName,
        data: new Array(keys.length).fill(0)
      };
    }
    dic[groupName].data[k] = documentCount;
  }
}
const values = Object.keys(dic).sort().map(n => dic[n]);
console.log(values);

Результат

[ { groupName: 'Fruits', data: [ 5, 1 ] },
  { groupName: 'Desserts', data: [ 0, 5 ] },
  { groupName: 'Vegetables', data: [ 0, 6 ] } ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...