首页 > 解决方案 > 如何使用 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())
    
    
    
    
    }

标签: javascript

解决方案


使用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));


推荐阅读