将数组里某个属性相同的对象合并到一个数组中

原数组示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let oldData = [
{
type:"篮球",
value:20
},
{
type:"跑步",
value:40
},
{
type:"游泳",
value:10
}
{
type:"跑步",
value:15
}
]

1
希望获得的数据格式(即将相同”type“值的对象合并为一个新的数组)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
let resultData = [
{
type: "篮球",
infoList: [
{
type: "篮球",
value: 20,
},
],
},
{
type: "跑步",
infoList: [
{
type: "跑步",
value: 40,
},
{
type: "跑步",
value: 15,
},
],
},
{
type: "游泳",
infoList: [
{
type: "游泳",
value: 10,
},
],
},
];

实现方案

方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let tempArr = [];
let data = [];
for (let i = 0; i < oldData.length; i++) {
if (tempArr.indexOf(oldData[i].type) === -1) {
data.push({
type: oldData[i].type,
infoList: [oldData[i]],
});
tempArr.push(oldData[i].type);
} else {
for (let j = 0; j < data.length; j++) {
if (data[j].type == oldData[i].type) {
data[j].infoList.push(oldData[i]);
break;
}
}
}
}

方法二

1
2
3
4
5
6
7
8
9
10
11
12
13
let infoList = {};
oldData.forEach((item, index) => {
let { type } = item;
if (!infoList[type]) {
infoList[type] = {
type,
list: [],
};
}
infoList[type].list.push(item);
});

let list = Object.values(infoList); // 转换后的数据