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

Find number of occurences of string elements in an Array using lodash or underscore js

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

var array = [ 
  { id: '555weibo' },
  { id: '578weibo' },
  { id: '111facebook' },
  { id: '123facebook' },
  { id: '145facebookpage' },
  { id: '145facebookpage' },
  { id: '766facebook' },
  { id: '242facebook' },
  { id: '432twitter' },
  { id: '432exing' }
 ];

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

{
  weibo: 2,
  facebook: 6,
  twitter: 1,
  xing: 1
}

我已经搜索了解决方案,但似乎没有任何效果。

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

var filtered = _.map(diff, function(value, key) {
   return { id: key, count:value };
});

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

这是一个解决方案,您不需要任何库:

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

使用下划线:

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};
});

以下是使用 lodash 的方法:

_.countBy(array, _.flow(
    _.method('id.replace', /^\d+/, ''),
    _.method('replace', /page$/, '')
));
  • countBy() returns 以计数作为值的对象。键是由传入的回调生成的,因此您可以在此处解析和操作要作为计数依据的键。
  • flow()生成一个函数,通常用于回调map()等。它接受任意数量的函数作为参数。通过这些函数中的每一个过滤输入并返回结果。这是编写回调的强大方法,因为它很容易 rearrange/add/remove 它的各个部分。
  • method() returns 在给定对象上调用的函数。您想在此处用空字符串替换开头的数字。
  • method() 在这里做同样的事情,除了它从字符串的末尾删除 page 。请注意没有 id 前缀,因为它只是被传递给它前面的函数的结果。