groupBy实现数据分组

lodash中的groupBy方法非常好用,它可以帮你快速地按照特定的方式将数据进行分组。

对于数据分组,这样的例子也不少,比如一组账单数据,我需要按天查看,按周查看,按月查看等等,这时,就可以使用groupBy将它们按照时间来分成不同的组。

那么,如果要自己的来实现一个groupBy方法,该如何实现呢?

stackoverflow上某位大神实现了一个简洁而有效的方法,代码如下。

function groupBy(array, fn) {
  let groups = {}

  array.forEach(o => {
    let group = JSON.stringify(fn(o))
    groups[group] = groups[group] || []
    groups[group].push(o)
  })

  return Object.keys(groups).map(group => groups[group])
}

测试一下

let data = [
  { name: 'Gene', team: 'alpha' },
  { name: 'George', team: 'beta' },
  { name: 'Steve', team: 'gamma' },
  { name: 'Paula', team: 'beta' },
  { name: 'Scruath', team: 'gamma' }
]

let grouped = groupBy(data, item => item.team)
console.log(grouped)

可以看到输出

[ [ { name: 'Gene', team: 'alpha' } ],
  [ { name: 'George', team: 'beta' },
    { name: 'Paula', team: 'beta' } ],
  [ { name: 'Steve', team: 'gamma' },
    { name: 'Scruath', team: 'gamma' } ] ]

看一下他的实现核心方式是将要groupBy的字段的值拿到当做键,使用该键在groups对象中添加一个数组对象,不存在就创建新数组,已存在,则添加该对象到数组,这样就起到了分组的效果。

可以说是简洁明了,当然,这只是简单的demo,具体的实现,还是要结合具体的场景来进行灵活处理,不过核心思路都是一致的。

如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注