如何统计数组 字符串 对象中某一元素出现的次数

如何统计数组中某一元素出现的次数,字符串元素出现的次数或者对象中某一属性值出现的次数呢?
对于统计数组中某一元素出现的次数,可以这样:

function arrNumber(arr){
var arr_number = {};
for(var i = 0 ; i < arr.length ; i++){
if(arr_number[arr[i]]){
arr_number[arr[i]]++
}
else{
arr_number[arr[i]] = 1 ;
}
}
return arr_number ;
}
var array = [1,3,5,3,5,3];
arrNumber(array); //输出{1: 1, 3: 3, 5: 2}


同理,统计字符串元素出现的次数:

function charNum(str){
var charObj={} //创建一个空对象
for(i=0,len=str.length;i<len;i++){
if(charObj[str[i]]){ //str[i]为key
charObj[str[i]]++; //charObj[str[i]]为value
}else{
charObj[str[i]]=1;
}
}
var strTem=""; // 临时变量
for(value in charObj){
strTem+='"'+value+'"的个数:'+charObj[value]+'\n';
}
return strTem;
}
document.write(charNum("11,23")); //"1"的个数:2 "2"的个数:1 "3"的个数:1 ","的个数:1


有没有更简单一点的方法呢?恩。。。有了,underscore中的countBy()方法可以帮我们解决这个问题。
对于统计数组元素出现的次数:

var array = [1,3,5,3,5,3];
_(array).countBy() // 输出{1: 1, 3: 3, 5: 2}

看,是不是很一步就搞定呐 :D
对于统计字符串元素出现的次数:

var array = "12121";
_(array).countBy()); // {1: 3, 2: 2}

数组和字符串统计元素出现的次数解决了,那对象呢?如何统计对象中某属性值出现的次数呢?
如:

var user_list =
[{"name":"王五","phone":"189900971077","price":"8"},
{"name":"李四","phone":"189900971078","price":"6"},
{"name":"张三","phone":"189900971079","price":"8"}];

怎么统计价钱出现的次数呢?
如果只是为了获取价钱出现的次数,可以先把价钱单独提出为一个新数组,然后按照上面统计数组元素的方法就可以了:
提取对象中某一属性值,可以用underscore中的pluck()方法。
 var price = _(user_list).pluck('price')  //["8", "6", "8"] 

然后对price运用countBy()方法就好了
_(price).countBy()  //{6: 1, 8: 2} 

可是我不仅想得到某价钱的人数,我还想知道出这个价钱有哪些人。那我该怎么办呢?。。。underscore来帮你!
 _(user_list).groupBy("price") 

输出结果:

{6: [{name: "李四", phone: "189900971078", price: "6"}] ,
8: [{name: "王五", phone: "189900971077", price: "8"},
{name: "张三", phone: "189900971079", price: "8"}]}

这时得到的是一个对象,key为价钱,value是此价钱对应的人员信息组成的数组。
如果我想得到价钱最低且不重复的出价人信息呢?首先当然是用sortBy()对user_list按价钱排序啦,然后用groupBy()按价钱分组,最后就是用find()方法找到value的长度为1的对象。(find()如果找到匹配的元素,函数将立即返回,不会遍历整个list。)这样连续使用多种方法,是不是需要定义很多变量呢?有没有什么方法可以简化呢?
underscore又来啦:
  
var lowest_price = _.chain(user_list)
.sortBy("price")
.groupBy("price")
.find(function(value){return value.length ==1 })
.value();

输出lowest_price:

[{name: "李四", phone: "189900971078", price: "6"}]
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值