javascript - 如何使用 map 的 reduce 转换对象数组?
问题描述
我正在尝试转换 array of object to different
格式。我也参考了这个 url
通过多个属性对 js 对象进行分组
但无法解决问题我有一个包含类和部分的输入array of object
,我需要根据类和部分以不同格式转换或过滤学生。
这是我的代码 https://jsbin.com/nidudisuza/edit?js,output
let expectedout = [
{
class: 1,
sections: [{
"section": "B",
students: [ {
"name": "Test",
"class": 1,
"gender": "M",
"section": "B",
"rollNumber": "123111",
"sports": [
"Badminton",
"Chess"
],
"age": 7
}]
}]
},
{
class: 3,
sections: [{
"section": "B",
students: [{
"name": "Rahul",
"class": 3,
"gender": "M",
"section": "B",
"rollNumber": "1231",
"sports": [
"Badminton",
"Chess"
],
"age": 7
}]
}]
},
{
class: 5,
sections: [{
"section": "C",
students: [
{
"name": "Rajat",
"class": 5,
"gender": "M",
"section": "C",
"rollNumber": "123122",
"sports": [
"Chess"
],
"age": 9
}
]
}]
}
]
const input = [{
"name": "Rahul",
"class": 3,
"gender": "M",
"section": "B",
"rollNumber": "1231",
"sports": [
"Badminton",
"Chess"
],
"age": 7
},
{
"name": "Rajat",
"class": 5,
"gender": "M",
"section": "C",
"rollNumber": "123122",
"sports": [
"Chess"
],
"age": 9
},
{
"name": "Test",
"class": 1,
"gender": "M",
"section": "B",
"rollNumber": "123111",
"sports": [
"Badminton",
"Chess"
],
"age": 7
},
]
function abc() {
// let output =
// data.map((i) => {
// let obj = {};
// obj.class = i.class;
// obj.sections = [];
// obj.sections.push({
// section:obj.section,
// students:[obj]
// })
// return obj;
// })
let output =input.reduce((acc,i)=>{
let cls = i.class;
const found = acc.some(el => el.class === cls);
let obj = {
section:i.section,
students:[]
}
found.sections.students.push[i]
},[])
return output
}
console.log(abc())
}
解决方案
使用Array#reduce使用收集的数据构建一个对象。如果存在此类的属性,则 Foreach 对象在累积的对象中查找。如果没有创建一个并添加到这个类的基础结构。然后在这两种情况下为学生数组添加该学生的新条目。
通过此创建对象后,使用Object#entries仅获取对象的值以获取 ished 数组。
function modify(data) {
let res= Object.values(data.reduce((acc, cur) => {
if (!acc[cur.class]) {
acc[cur.class] = {
class: cur.class,
sections: [{
"section": cur.section,
students: []
}]
};
}
acc[cur.class].sections[0].students.push(cur);
return acc;
},{}));
return res;
}
const data = [{
"name": "Rahul",
"class": 3,
"gender": "M",
"section": "B",
"rollNumber": "1231",
"sports": [
"Badminton",
"Chess"
],
"age": 7
},
{
"name": "Rajat",
"class": 5,
"gender": "M",
"section": "C",
"rollNumber": "123122",
"sports": [
"Chess"
],
"age": 9
},
{
"name": "Test",
"class": 1,
"gender": "M",
"section": "B",
"rollNumber": "123111",
"sports": [
"Badminton",
"Chess"
],
"age": 7
},
]
console.log(modify(data));
推荐阅读
- r - 向数据框的不同列添加不同的数字
- r - 使用 Heroku 错误 R10(启动超时)部署闪亮的应用程序
- r - 连接ggplot中的点
- video-streaming - 如何在两台计算机上没有 OBS Studio 的情况下流式传输视频,一台只是 Firefox?
- css - 在复杂的 Saas 应用程序上实现暗模式的最佳方法
- arrays - 二维数组检查数组是否按升序排序
- python - python中是否有查找磁盘上文件的逻辑或物理偏移量的功能?
- mimekit - MImekit - 为什么我们需要数据库用于证书存储和 DefaultSecureMimeContext?
- r - 如何选择仅包含 r 中常见日期的数据?
- python - 在列号是操作数之一的情况下进行操作?