【问题标题】:Find number of occurences of string elements in an Array using lodash or underscore js使用lodash或下划线js查找数组中字符串元素的出现次数
【发布时间】:2015-08-03 00:08:31
【问题描述】:

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

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

【问题讨论】:

    标签: javascript underscore.js lodash


    【解决方案1】:

    以下是使用 lodash 的方法:

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

    【讨论】:

      【解决方案2】:

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

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

      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

      【讨论】:

      • 在人类可读性方面略有提高 - jsbin.com/kegahediyu/3/edit?js,console,output
      • @PeterSeliger 我不确定(item.id.indexOf(key) >= 0) && collector[key]++; 是否适合所有人阅读:)
      • @dystroy - 你是绝对正确的 - 更新:jsbin.com/pamoloyore/2/edit?js,console,output
      • 使用 lodash var ret = {facebook: 0, weibo: 0, twitter: 0, xing: 0}; _.reduce(array, function(result, val) { _.forEach(result, function(v, key){ if(val.id.indexOf(key) > 0) result[key]++; }); return result; }, ret); 转换您的代码
      【解决方案3】:

      使用下划线:

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

      【讨论】:

      • 你能解释一下答案吗,发生了什么或者什么是地图和拒绝功能,这可能会帮助像我这样的菜鸟
      猜你喜欢
      • 1970-01-01
      • 2015-05-13
      • 2023-03-28
      • 2014-08-31
      • 2022-01-02
      • 2016-06-07
      • 1970-01-01
      • 2021-01-06
      • 2021-02-27
      相关资源
      最近更新 更多