Javascript 在两个结构之间转换数据

Javascript 在两个结构之间转换数据,javascript,typescript,Javascript,Typescript,我需要根据小组中的部门计算分数。为了简化这一点,我仅使用了1个组作为示例 我收到这个数据结构: const data = [{ "id": "cklt7ln1k0922o0sabjkk74m9", "score": 80, "count": 1, "department": "Engineer

我需要根据小组中的部门计算分数。为了简化这一点,我仅使用了1个组作为示例

我收到这个数据结构:

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。问题不清楚。。。