实用的 JavaScript 对象分组静态方法 Object.groupBy()
2025-01-22 08:19:30 888 字
This post is also available in English and alternative languages.
1. 原生分组方法Object.groupBy()
好消息,所有现代浏览器都已经支持浏览器原生的静态方法Object.groupBy()
了,如下图所示,Safari浏览器支持最晚,今年4月份才开始支持。
这就意味着最晚明年,就算不使用Polyfill代码,也能在生产环境使用该方法了。
1.1. 作用
Object.groupBy()
可以让可枚举对象,根据某个键进行自动分组。
例如:
1 | const data = [{ |
输出结果则是:
1 | {张三: Array(2), 李四: Array(1), 王二: Array(1)} |
截图如下:
1.2. 语法
Object.groupBy(items, callbackFn)
- items:将被分组的可迭代对象。
- callbackFn(element, index):为可迭代对象中的每个元素执行的函数。其返回值会被作为键,用来指向分组后的数组项。使用以下参数调用该函数。
1.3. Polyfill代码
如果要兼容陈旧浏览器,可以试试使用这段JavaScript代码:
1 | const hasGroup = typeof Object.groupBy === typeof undefined || typeof Array.groupToMap === typeof undefined || typeof Array.group === typeof undefined; |
2. 实际案例
我在某项目开发中已经使用过此API了,给大家演示下使用场景。
已知有数组:
1 | const okrAlignList = [{ |
然后页面渲染的时候,如果是同一人,是需要合并展示的,如配图所示:
此时,我们就可以直接使用Object.groupBy()
方法进行渲染,而不需要自己额外写一个分组方法了,此时的Vue模板渲染使用下面的就可以了:
1 | <data |
代码简洁多了。
3. 还有Map.groupBy()方法
除了Object
对象有groupBy()
静态方法,Map
对象也有,兼容性一致,语法也是一样的。
使用示意:
1 | const inventory = [ |
Map.groupBy()
使用用在分组信息会随时间变化的场景下,因为即使对象被修改,它仍将继续作为返回Map的键。
其他时候,换成使用Object.groupBy()
实现也是可以的。