有没有人可以指导我在如何创建下面的输出。 我需要使用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) {
}
}
一种方法是:构建一个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的答案完全相同,但没有对vos
,vod
和voe
属性进行硬编码。 有关解释,请查看链接的答案。
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);