首页 > 解决方案 > 如何格式化 JSON 对象数组(Javascript)

问题描述

我正在为一个我不知道如何处理的苛刻要求而苦苦挣扎

我收到了一个数组,如下所示:

[{
    "student": "21_A_1",
    "sport": "badminton"
}, {
    "student": "21_C_1",
    "sport": "badminton"
}, {
    "student": "21_A_2",
    "sport": "badminton"
}, {
    "student": "21_B_1",
    "sport": "football"
}, {
    "student": "21_A_2",
    "sport": "football"
}]

要求:将其转换为具有格式的数组:

[{
    "student": "21_A_1",
    "sport": ["badminton"]
}, {
    "student": "21_C_1",
    "sport": ["badminton"]
}, {
    "student": "21_A_2",
    "sport": ["badminton","football"]
}, {
    "student": "21_B_1",
    "sport": ["football"]
}]

我发现lodash库有一个功能“group by”返回了非常封闭的结果,但并不像预期的那样:

_.groupBy(array, 'student');

结果:

{
    "21_A_1": [{
        "student": "21_A_1",
        "sport": "badminton"
    }],
    "21_C_1": [{
        "student": "21_C_1",
        "sport": "badminton"
    }],
    "21_A_2": [{
        "student": "21_A_2",
        "sport": "badminton"
    }, {
        "student": "21_A_2",
        "sport": "football"
    }],
    "21_B_1": [{
        "student": "21_B_1",
        "sport": "football"
    }]
}

任何建议都非常感谢。

标签: javascriptarraysjsonlodash

解决方案


我们可以使用数组的'.reduce'函数和聚合结果如下

var test = [{
    "student": "21_A_1",
    "sport": "badminton"
}, {
    "student": "21_C_1",
    "sport": "badminton"
}, {
    "student": "21_A_2",
    "sport": "badminton"
}, {
    "student": "21_B_1",
    "sport": "football"
}, {
    "student": "21_A_2",
    "sport": "football"
}]
const result = test.reduce((res,x)=>{
   res[x.student] = res[x.student] || { student:x.student,sport:[]}
   res[x.student].sport.push(x.sport)
   return res;
},{})

console.log(result)


推荐阅读