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

Using lodash to group filter data and combine

我有这样的输出:

{ 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() 但运气不好。

这是一个将多个 lodash 函数链接在一起的示例:

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

这是正在发生的事情:

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

您也可以试试这个解决方案:

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