转载于:前进中的蜗牛
let list = [
{name:"1000积分",serialNumber:6},
{name:"500积分",serialNumber:7},
{name:"50积分",serialNumber:8},
{name:"50积分",serialNumber:8},
{name:"50积分",serialNumber:8}
];
//怎么将list转换为下面格式:
[
{title:"1000积分",num:1},
{title:"500积分",num:1},
{title:"50积分",num:3}
]//num:serialNumber相同的元素重复次数
1. 首先要先获取所有需要计算的属性值
//先根据所有的title组合成一个数组
let titleList = list.map(item => {
return item.name
})
//获得["1000积分", "500积分", "50积分", "50积分", "50积分"]
2. 有两种方法将上面返回的结果变成:{1000积分: 1, 500积分: 1, 50积分: 3}
(1)常规的方法:使用 for 循环 ;
function getRepeatNum(){
var obj = {};
for(var i= 0, l = titleList.length; i< l; i++){
var item = arr[i];
obj[item] = (obj[item] +1 ) || 1;
}
return obj;
}
(2)使用 reduce(),接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。支持IE9+
//用reduce时:
//reduce:计算数组元素相加后的总和
//reduce方法接受两个参数,第一个是函数,第二个是初始值
function getRepeatNum(){
return titleList.reduce(function(prev,next){
prev[next] = (prev[next] + 1) || 1;
return prev;
},{});
}
console.log(getRepeatNum());//获得{1000积分: 1, 500积分: 1, 50积分: 3}
3. 得到最终结果
let myObj = this.getRepeatNum2(titleList),winningList = [];
for(let i in myObj){
let obj = {
title:i,
num:myObj[i]
}
winningList.push(obj)
}
console.log(winningList)
//[{"title":"1000积分","num":1},{"title":"500积分","num":1},{"title":"50积分","num":3}]