js 计算对象数组中某个属性值重复出现的个数
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}]
项目中实测:
// 统计数组对象某个属性出现的个数 /* * arr 是对象数组 * pop 是对象某个属性 * value 是定位到哪个属性是否重复了 */ isRepeat (arr, prop = '', value = '') { var hash = {} for (var i in arr) { if (prop) { hash[arr[i][prop]] = (hash[arr[i][prop]] + 1) || 1 } else { hash[arr[i]] = (hash[arr[i]] + 1) || 1 } } if (value && hash[value] > 1) { return true } return false }