提问者:小点点

对象数据转换的嵌套数组


有没有人可以指导我在如何创建下面的输出。 我需要使用chart.js创建一个图

我有3个角色像vos,voe,vod

我从数据库中得到的结果是

const d = [{
  roleId: 1,
  role: 'vos',
  rating: 5,
  date: '2020-07-07',
},
{
  roleId: 3,
  role: 'voe',
  rating: 3,
  date: '2020-07-07',
},
{
  roleId: 1,
  role: 'vos',
  rating: 5,
  date: '2020-07-04',
},
{
  roleId: 1,
  role: 'vos',
  rating: 3,
  date: '2020-07-01',
}];

如果我没有得到一个特定日期的角色,那么需要为它添加0评级在一个角色数组,它属于。 谁能指导和解释一下。 我总是觉得转换数据很难。

输出量

{
 dates: ['2020-07-01', '2020-07-04', '2020-07-07'],
 vos: [3, 5, 5],
 vod: [0, 0, 0],
 voe: [0, 0, 3]
}

我正试着不确定如何前进。

const res = {
  label: [],
  vos: [],
  vod: [],
  voe: []
};
const newSet = new Set();
for (let i = 0; i < d.length; i += 1) {
  constnewSet.add(d[i]);
  const date = [...newSet];
  for (let j = 0; j < date.length; j += 1) {

  }
}


共2个答案

匿名用户

一种方法是:构建一个helper map-object,其中包含按日期分组的数据。 然后对此对象的键进行排序,得到一个按日期排序的数组,然后可以迭代并构建结果对象:

null

function groupData(data) {
  const dateMap = {};

  for (const entry of data) {
    if (!dateMap[entry.date]) {
      dateMap[entry.date] = { vos: 0, vod: 0, voe: 0 };
    }
    dateMap[entry.date][entry.role] = entry.rating;
  }

  const dates = Object.keys(dateMap).sort();
  const res = { dates: [], vos: [], vod: [], voe: [] };
  for (const date of dates) {
    res.dates.push(date);
    res.vos.push(dateMap[date].vos);
    res.vod.push(dateMap[date].vod);
    res.voe.push(dateMap[date].voe);
  }

  return res;
}
const d=[{roleId:1,role:'vos',rating:5,date:'2020-07-07',},{roleId:3,role:'voe',rating:3,date:'2020-07-07',},{roleId:1,role:'vos',rating:5,date:'2020-07-04',},{roleId:1,role:'vos',rating:3,date:'2020-07-01',},];
console.log(groupData(d));

匿名用户

这个答案与eol的答案完全相同,但没有对vosvodvoe属性进行硬编码。 有关解释,请查看链接的答案。

null

const roles = ['vos', 'vod', 'voe'];
const records = [
  { roleId: 1, role: 'vos', rating: 5, date: '2020-07-07' },
  { roleId: 3, role: 'voe', rating: 3, date: '2020-07-07' },
  { roleId: 1, role: 'vos', rating: 5, date: '2020-07-04' },
  { roleId: 1, role: 'vos', rating: 3, date: '2020-07-01' },
];

const ratings = {};
for (const { role, rating, date } of records) {
  if (!ratings[date]) {
    ratings[date] = Object.fromEntries(roles.map(role => [role, 0]));
  }
  ratings[date][role] = rating;
}

const dates = Object.keys(ratings).sort();
const result = Object.assign(
  { dates },
  Object.fromEntries(
    roles.map(role => [role, dates.map(date => ratings[date][role])])
  )
);

console.log(result);