ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

js 计算对象数组中某个属性值重复出现的个数

2022-05-20 12:02:24  阅读:268  来源: 互联网

标签:arr return title 积分 个数 50 js num 数组


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
    }

  

标签:arr,return,title,积分,个数,50,js,num,数组
来源: https://www.cnblogs.com/mmzuo-798/p/16291843.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有