将数组里有相同ID的数据合并到一起,并将相同ID的数据里的num的值相加。
假设数据为:
let oldArr = [
{ num: 123, id: 'id1' },
{ num: 124, id: 'id2' },
{ num: 125, id: 'id1' },
{ num: 126, id: 'id1' },
{ num: 127, id: 'id3' },
];
期待得到的数据:
!!!为了测试几种方法的性能,写了一个makeMoreOldarr函数为oldArr添加更多数据(数据太少,可能无法捕捉):
function makeMoreOldarr () {
for (let i = 0; i < 10000; i++) {
oldArr.push({
num: i,
id: 'id'+i
})
}
}
方法一:两次for循环+indexOf()
代码:
// 两次for循环
function getnumByDoubleFor (arr) {
let newArr = []
temp = []
for (let i = 0; i < arr.length; i++) {
if (temp.indexOf(arr[i].id) === -1) {
newArr.push({
num: arr[i].num,
id: arr[i].id
})
temp.push(arr[i].id)
} else {
for (let a = 0; a < newArr.length; a++) {
if (newArr[a].id === oldArr[i].id) {
newArr[a].num += oldArr[i].num
break;
}
}
}
}
return newArr
}
耗时:227.7ms (超级耗时,几种方法里最耗时的一种)
方法二:for循环+indexOf()
代码:
//for循环+indexOf
function getnumsByIndexOf (arr) {
var newArr = []
var temp = []
for (let i = 0; i < arr.length; i++) {
if (temp.indexOf(arr[i].id) == -1) {
newArr.push({
num: arr[i].num,
id: arr[i].id
})
temp.push(arr[i].id)
} else {
var index = temp.indexOf(arr[i].id)
newArr[index].num += arr[i].num
}
}
return newArr
}
getnumsByIndexOf(oldArr);
耗时:211.5ms(也超级耗时,只比两次for循环好一点点)
方法三、for循环+map
代码:
// for循环+map
function getnumByMap (arr) {
let mapArr = new Map()
let newArr = []
for (let i = 0; i < arr.length; i++) {
mapArr.has(arr[i].id) ? mapArr.set(arr[i].id, mapArr.get(arr[i].id) + arr[i].num) : mapArr.set(arr[i].id, arr[i].num)
}
mapArr.forEach((item, index) => {
newArr.push({
id: index,
num: item
})
})
return newArr
}
耗时:7.9ms(比for循环+indexOf好多啦,和filter+ map + for of差不多)
方法四、filter+ map + for of
代码:
//filter+ map + for of
function getnumByFilter (arr) {
let maps = new Map()
let newArr = []
arr.filter((item) => {
!maps.has(item.id) ? maps.set(item.id, item.num) : maps.set(item.id, item.num + maps.get(item.id))
})
for (let [key, num] of maps) {
newArr.push({
id: key,
num: num
})
}
return newArr;
}
耗时:7.5ms(和for循环+map差不多)
方法五、filter+ map + forEach
代码:
//filter+ map + forEach
function getnumByFilterForEach (arr) {
let maps = new Map()
let newArr = []
arr.filter((item) => {
!maps.has(item.id) ? maps.set(item.id, item.num) : maps.set(item.id, item.num + maps.get(item.id))
})
maps.forEach((item, index) => {
newArr.push({
id: index,
num: item
})
})
return newArr;
}
耗时:4.7ms(最快的!)