javascript转换数据结构

如何将 result 转换为 newResult 的数据结构, 根据 groupQuestionId的相同, 来添加index, 作为序号

```javascript
let result = [
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15615},
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15615},
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15615}, 
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15616},
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15617}
    ]

    let newResult = [
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15615, index: '1-1'},
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15615, index: '1-2'},
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15615, index: '1-3'}, 
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15616, index: '2'},
      {avgScore: null,createTime: "2022-05-20 13:59:05",createUserId: 61622,groupQuestionId: 15617, index: '3'}
    ]

```



<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 如何将 result 转换为 newResult 的数据结构


        let result = [
            { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15615 },
            { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15615 },
            { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15615 },
            { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15616 },
            { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15617 }
        ]

        let new_arr = [], newResult = [];
        result.forEach((item, index) => {
            if (Array.isArray(new_arr) && new_arr.length > 0) {
                let new_idnex = new_arr.findIndex(zitem => zitem.some(sitem => sitem.groupQuestionId == item.groupQuestionId))
                if (new_idnex != -1) {
                    new_arr[new_idnex].push(item)
                } else {
                    new_arr.push([item])
                }
            } else {
                new_arr.push([item])
            }
        })

        new_arr.forEach((item, index) => {
            if (Array.isArray(item) && item.length > 0) {
                item.forEach((zitem, zindex, itemarr) => {
                    if (itemarr.length > 1) {
                        zitem.index = (index + 1) + '-' + (zindex + 1)
                        newResult.push(zitem)
                    } else {
                        zitem.index = (index + 1) + ''
                        newResult.push(zitem)
                    }

                })
            }
        })




        console.log(JSON.stringify(newResult, null, 2))


        // let newResult = [
        //     { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15615, index: '1-1' },
        //     { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15615, index: '1-2' },
        //     { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15615, index: '1-3' },
        //     { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15616, index: '2' },
        //     { avgScore: null, createTime: "2022-05-20 13:59:05", createUserId: 61622, groupQuestionId: 15617, index: '3' }
        // ]
    </script>
</body>

</html>

虽然回答已采纳哈哈,但是还是来试试
贴下代码,使用hashmap做记录,时间复杂度O(n),空间复杂度O(n)

// let result这块就不贴上来了
let map = new Map();
let newResult = result.map((tem, index) => {
    let idx = {};
    if (map.has(tem.groupQuestionId)) { // 判断该id是否已经存在
        const getCurrent = map.get(tem.groupQuestionId);
        getCurrent.i2 += 1;
        idx = getCurrent;
        tem.index = `${idx.i1} - ${idx.i2}`;
        if (idx.first >= 0) { // cover:id数不止1个
            result[idx.first].index = `${idx.i1} - 1`;
            delete idx.first
        }
    } else {
        idx = {
            i1: map.size + 1,
            i2: 1,
            first: index
        }; // 不存在则拿出map的长度作为index
        tem.index = `${idx.i1}`;
    }
    map.set(tem.groupQuestionId, idx)
    return tem;
})

对比@web修理工 代码的效率在50000条数据下快了大概38倍~

img