使用lodash对过滤器数据进行分组并合并

时间:2016-04-26 16:40:05

标签: lodash

我有这样的输出:

{ diagnosis: 'Flu' }
{ diagnosis: 'Down Syndrome' }
{ diagnosis: 'Down Syndrome' }
{ diagnosis: 'Epilepsy' }
{ diagnosis: 'Epilepsy' }
{ diagnosis: 'Muscle Spasm' }
{ diagnosis: 'Muscle Spasm' }
{ diagnosis: 'Epilepsy' }
{ diagnosis: 'Muscle Spasm' }
{ diagnosis: 'Nervousness' }
{ diagnosis: 'Weezing' }
{ diagnosis: 'Unknown' }

您会注意到Epilepsy显示4次,Muscle Tension and Spasm显示3次,Crazy Guy Syndrome显示2次,其余只显示一次。我想创建一个包含3种最常见疾病的数组,例如:['Epilepsy', 'Muscle Tension and Spasm', 'Crazy Guy Syndrome']并忽略其余的疾病。我想用lodash做这件事。有什么建议?目前我正在使用_.groupBy()而没有运气。

2 个答案:

答案 0 :(得分:4)

这是一个将几个lodash函数链接在一起的例子:

_(data)
  .map('diagnosis')
  .countBy()
  .toPairs()
  .sortBy(_.last)
  .reverse()
  .take(3)
  .map(_.head)
  .value();

这是&#39>正在进行的事情:

  1. map('diagnosis')创建一个新数组,只包含diagnosis属性值
  2. countBy()创建一个对象,其中键是数组的唯一值,值是该值的出现次数
  3. toPairs()将对象转换为键/值数组数组
  4. sortBy(_.last)使用sortBy()last()根据数据在原始data
  5. 中出现的次数对数组进行排序
  6. reverse()用于按降序对数组进行排序
  7. take(3)使用take()将数组结果限制为前三项
  8. map(_.head)使用map()head()删除排序数据

答案 1 :(得分:1)

你也可以尝试这个解决方案:

<强> DEMO

_(data)
    .countBy('diagnosis') // counts by diagnosis key
    .invert() // inverts count value and diagnosis key for sorting 
    .map() // get all diagnosis values
    .reverse() // reverse
    .take(3) // take the top 3
    .value();