Javascript 在两个结构之间转换数据
我需要根据小组中的部门计算分数。为了简化这一点,我仅使用了1个组作为示例 我收到这个数据结构:Javascript 在两个结构之间转换数据,javascript,typescript,Javascript,Typescript,我需要根据小组中的部门计算分数。为了简化这一点,我仅使用了1个组作为示例 我收到这个数据结构: const data = [{ "id": "cklt7ln1k0922o0sabjkk74m9", "score": 80, "count": 1, "department": "Engineer
const data = [{
"id": "cklt7ln1k0922o0sabjkk74m9",
"score": 80,
"count": 1,
"department": "Engineering",
"group": "Group one"
},
{
"id": "cklt7ln1k0922o0sabjkk74m9",
"score": 40,
"count": 1,
"department": "Executive",
"group": "Group one"
},
{
"id": "cklt7ln1k0922o0sabjkk74m9",
"score": 40,
"count": 1,
"department": "OOO Boost",
"group": "Group one"
},
{
"id": "cklt7ln1k0922o0sabjkk74m9",
"score": 60,
"count": 1,
"department": "Engineering",
"group": "Group one"
},
{
"id": "cklt7ln1k0922o0sabjkk74m9",
"score": 100,
"count": 2,
"department": "Supporting Department",
"group": "Group one"
},
{
"id": "cklt7ln1k0922o0sabjkk74m9",
"score": 20,
"count": 1,
"department": "Designers",
"group": "Group one"
},
{
"id": "cklt7ln1k0922o0sabjkk74m9",
"score": 20,
"count": 1,
"department": "Executive",
"group": "Group one"
}
];
我需要为热图创建一个数据结构:
const heatmapData = [
{
row: 'Group one',
columns: [
{
name: 'Engineering',
averageScore: 70, // (80[score] * 1[count] + 60[score] * 1[count]) / 2[sum of count -> 1+1]
},
{
name: 'Supporting Department',
averageScore: 100, // 100[score] * 2[count] / 2[sum of count -> 2]
},
.... next unique departments
]
}
]
我对一些简单的数据分组和计算的解决方案有点手足无措。你能帮我吗?谢谢您可以将项目分组到字典中:
let group = data.reduce((acc, val) => {
if(!acc[val.group]) acc[val.group] = {};
if(!acc[val.group][val.department]) acc[val.group][val.department] = {sum:0, count: 0, averageScore: 0};
acc[val.group][val.department] = {
sum: acc[val.group][val.department].sum+val.score,
count: acc[val.group][val.department].count + 1,
averageScore: (acc[val.group][val.department].sum+val.score) / (acc[val.group][val.department].count + 1)
}
return acc
}, {});
然后将其映射到请求的格式:
Object.keys(group).map(row => {
return {
row: row,
columns: Object.keys(group[row]).map(col => {return {name: col, averageScore: group[row][col].averageScore}})
}
})
请允许我解释一下它是如何工作的。。所以我们知道对象是指针而不是值。。我在整个解决方案中都使用了这一原则。我有要返回的数组(在这里我推送东西),然后我有2个对象来存储值(编辑这些对象会编辑数组中的“值”),所以在你传入的数组中,我基本上会向这些对象添加值,并将它们链接到数组中(你想要的格式) 再次更新。。我应用了您计算示例的逻辑>:D
功能组(数组){
let arr=[];let groups={};let departments={}
array.forEach(a=>{
如果(!groups[a.group]){//设置每个组
组[a.group]={行:a.group,列:[]}
arr.push(组[a.group])
}
如果(!departments[a.department]){//设置每个部门
部门[a.department]=[{name:a.department,averageScore:a.score*a.count},a.count]//分数*计数和计数(由于您的计算示例)
组[a.group].列.push(部门[a.department][0])
}
else{//在部门已存在时添加部门
部门[a.department][1]+=a.count//count
部门[a.department][0]。平均分数+=a.score*a.count//score*count
//(由于您的计算示例)
}
})
Object.keys(departments).forEach(a=>departments[a][0]。averageScore/=departments[a][1])
返回arr
}
console.log(组(数据))
//不要在答案中去掉不必要的空格
window.data=[{
“id”:“CKLT7LN1K0922O0SABJK74M9”,
“得分”:80分,
“计数”:1,
“部门”:“工程”,
“组”:“第一组”
},
{
“id”:“CKLT7LN1K0922O0SABJK74M9”,
“分数”:40分,
“计数”:1,
“部门”:“主管”,
“组”:“第一组”
},
{
“id”:“CKLT7LN1K0922O0SABJK74M9”,
“分数”:40分,
“计数”:1,
“部门”:“OOO推进”,
“组”:“第一组”
},
{
“id”:“CKLT7LN1K0922O0SABJK74M9”,
“分数”:60分,
“计数”:1,
“部门”:“工程”,
“组”:“第一组”
},
{
“id”:“CKLT7LN1K0922O0SABJK74M9”,
“分数”:100分,
“计数”:2,
“部门”:“支持部门”,
“组”:“第一组”
},
{
“id”:“CKLT7LN1K0922O0SABJK74M9”,
“得分”:20分,
“计数”:1,
“部门”:“设计师”,
“组”:“第一组”
},
{
“id”:“CKLT7LN1K0922O0SABJK74M9”,
“得分”:20分,
“计数”:1,
“部门”:“主管”,
“组”:“第一组”
}
];
您可以根据组对数据进行分组,对于每个组
,将其分组到部门
,并汇总得分
和计数
。拥有此对象后,可以计算每个部门的平均值
const data=[{“id”:“cklt7ln1k0922o0sabjkk74m9”,“分数”:80,“计数”:1,“部门”:“工程”,“组”:“第一组”},{“id”:“cklt7ln1k0922o0sabjk74m9”,“分数”:40,“计数”:1,“部门”:“执行官”,“组”:“第一组”},{“id”:“cklt7ln1k0922o0sabjkk74m9”,“分数”:40,“计数”:1,“部门”:“OOO推进”,“组”:“第一组”{“id”:“cklt7ln1k0922o0sabjkk74m9”,“分数”:60,“计数”:1,“部门”:“工程”,“组”:“第一组”{“id”:“CKLT7LN1K0922O0SABJK74M9”,“分数”:100,“计数”:2,“部门”:“支持部门”,“小组”:“第一组”},“id”:“CKLT7LN1K0922O0SABJKKKKK74M9”,“分数”:20,“计数”:1,“部门”:“设计师”组:““第一组”},{“id:“cklt7ln1k0922o0sabjkk74m9”,“分数”:20,“计数”:1,“部门”:“行政人员”,“组”:“第一组”},
分组=数据。减少((r,{组,部门,分数,计数})=>{
r[群]=r[群]|{};
r[组][部门]=r[组][部门]|{部门,总分:0,计数:0};
r[组][部门].总分+=得分*计数;
r[集团][部门].计数+=计数;
返回r;
},{}),
结果=对象.keys(分组).map(k=>{
const columns=Object.values(分组[k]).map(d=>({
部门:d部门,
平均得分:d.totalScore/d.count
}));
返回{行:k,列};
})
console.log(结果);
.as控制台包装{最大高度:100%!重要;顶部:0;}
所以你基本上想要收集所有分数并将它们相加。这是正确的吗?如果你想要列
那么你知道那将是一个数组吗?@TheBombSquad为什么它必须是一个数组?你也可以制作一个数组object@MrJami他们的方式,特别是一个数组,虽然是真的,格式杰克如何使用它似乎更像是一个数组。@TheBombSquad Gotcha如果支持部门
在数组中只出现一次,平均得分
应该是100/1=100
对吧?支持部门
的计数是2。问题不清楚。。。