如何将多个对象组合/组合为单个对象同名的多个对象(嵌套)



>我有一个学生的数据和他们在各个科目中的分数作为一组对象。当两个对象的名称相同时,我需要将数据合并为单个对象,以便每个学生只有一条记录。示例数据示例:

{
    data: [{
        "name: xxx,
    "createdDate:10/01/2018,
    subj1: 20,
        subj2: 40
    },
    {
        "name: xxx,
    "createdDate:10/11/2017,
    subj1: 40,
        subj2: 70
    },
    {
        "name: yyy,
    "createdDate:10/01/2018,
    subj1: 20,
        subj2: 40
    }]
}

我需要将其转换为这样的东西:

{
    data: [
        {
            name: xxx,
            subj1: [20, 40],
            subj2: [70, 40]
        },
        {
            name: yyy,
            subj1: [20],
            subj2: [40]
        }
    ]
}

我怎样才能在node js中实现这一目标.只有通过循环,我才能做到,或者有没有一种简单的方法可以通过使用 lodash,underscore js 等库来实现这一点。

您可以使用map和reduce来做这样的事情:

let sampleData = {
data:[{
name: "xxx",
createdDate:10/01/2018,
subj1:20,
subj2:40
},
{
name: "xxx",
createdDate:10/11/2017,
subj1:40,
subj2:70
},
{
name: "yyy",
createdDate:10/01/2018,
subj1:20,
subj2:40
}]
};
let sorted = sampleData.data.sort((element1, element2) => {
	return element1.name <= element2.name ? -1 : 1
}).reduce((accumulator, currentValue, currentIndex, array) => {
  	if (accumulator.data.length == 0){
  	accumulator.data.push({name:currentValue.name, subj1:[currentValue.subj1], subj2:[currentValue.subj2]});
    return accumulator;
  } else {
    if (accumulator.data[accumulator.data.length - 1].name == currentValue.name){
    	accumulator.data[accumulator.data.length - 1].subj1.push(currentValue.subj1);
      accumulator.data[accumulator.data.length - 1].subj2.push(currentValue.subj2);
    } else {
    	accumulator.data.push({name:currentValue.name, subj1:[currentValue.subj1], subj2:[currentValue.subj2]});
    }
    return accumulator;
  }
}, {data:[]})
console.log(sorted)

最新更新