首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lodash或下划线js查找数组中字符串元素的出现次数

使用lodash或下划线js查找数组中字符串元素的出现次数
EN

Stack Overflow用户
提问于 2015-05-21 18:59:53
回答 3查看 19.9K关注 0票数 11

我有一个以下格式的数组:

代码语言:javascript
复制
var array = [ 
  { id: '555weibo' },
  { id: '578weibo' },
  { id: '111facebook' },
  { id: '123facebook' },
  { id: '145facebookpage' },
  { id: '145facebookpage' },
  { id: '766facebook' },
  { id: '242facebook' },
  { id: '432twitter' },
  { id: '432exing' }
 ];

我需要找出该数组中facebooktwitterxingweibo出现的次数。例如:

代码语言:javascript
复制
{
  weibo: 2,
  facebook: 6,
  twitter: 1,
  xing: 1
}

我一直在寻找解决方案,但似乎都不起作用。

下面的代码没有给出预期的结果。非常感谢您的帮助。谢谢。

代码语言:javascript
复制
var filtered = _.map(diff, function(value, key) {
   return { id: key, count:value };
});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-21 19:25:14

使用下划线:

代码语言:javascript
复制
var services = ['weibo', 'facebook', 'twitter', 'xing'];
var result = _.map(services, function(service){ 
     var length = _.reject(array, function(el){
           return (el.id.indexOf(service) < 0); 
     }).length; 
     return {id: service, count: length};
});
票数 4
EN

Stack Overflow用户

发布于 2015-05-21 20:11:02

下面是如何使用lodash来完成此操作:

代码语言:javascript
复制
_.countBy(array, _.flow(
    _.method('id.replace', /^\d+/, ''),
    _.method('replace', /page$/, '')
));

  • countBy()返回一个以counts作为值的对象。键是由传入的回调生成的,因此您可以在这里解析和操作要计数的键,by.
  • flow()生成一个函数,通常用于对map()的回调,等等。它接受任意数量的函数作为参数。这些函数中的每一个都会过滤输入,并返回结果。这是一种编写回调的强大方法,因为它很容易重新排列/添加/删除它的parts.
  • method()返回一个在给定对象上调用的函数。您想用一个空字符串替换开头的数字,here.
  • method()在这里做了同样的事情,只是它从字符串的末尾删除了page。注意没有id前缀,因为它只是被传递给前面的函数的结果。
票数 16
EN

Stack Overflow用户

发布于 2015-05-21 19:04:28

您必须指定可能的键,因为在初始数组中无法猜测它们。

这里有一个解决方案,你不需要任何库:

代码语言:javascript
复制
var filtered = array.reduce(function(m,v){
    for (var k in m) if (~v.id.indexOf(k)) m[k]++;
    return m;
},{facebook:0, weibo:0, twitter:0, xing:0});

Demonstration

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30371785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档