当前位置: 首页 > Web前端 > JavaScript

JavaScript 中的数组分组:array.groupBy()

时间:2023-03-27 15:44:02 JavaScript

JavaScript中的数组分组:array.groupBy()红宝石编程语言。例如,Ruby中的数组有大量的方法。JavaScript也逐渐丰富了它的字符串和数组标准库。例如,在之前的文章中,我描述了新的array.at()方法。今天的功能是新的数组组提案(目前处于第3阶段),它引入了新方法array.groupBy()和array.groupByToMap()。他们的polyfills在core-js库中可用。让我们看看如何从分组方法中获益。1.array.groupBy()你有一个产品列表,其中每个产品都是一个具有2个属性的对象:名称和类别。constproducts=[{name:'apples',category:'fruits'},{name:'oranges',category:'fruits'},{name:'potatoes',category:'蔬菜'}];在上面的例子中,products是一个产品对象数组。现在您必须对产品列表执行一个简单的操作——按类别对产品进行分组。constgroupByCategory={'fruits':[{name:'apples',category:'fruits'},{name:'oranges',category:'fruits'},],'vegetables':[{name:'土豆',类别:'蔬菜'}]};您如何groupByCategory从数组中获取产品数组?通常的方法是使用正确的回调函数调用array.reduce()方法:constgroupByCategory=products.reduce((group,product)=>{const{category}=product;group[category]??=group[category]??[];group[category].push(product);returngroup;},{});console.log(groupByCategory);//{//'fruits':[//{name:'apples',category:'fruits'},//{name:'oranges',category:'fruits'},//],//'vegetables':[//{name:'potatoes',category:'vegetables'}//]//}products.reduce((acc,product)=>{...})将产品数组缩减为按类别分组的产品对象。虽然我确实认为array.reduce()方法有用且功能强大,但有时它的可读性并不是最好的。因为分组数据是一项重复性任务(GROUPBY还记得SQL吗?),所以数组组提案引入了两个有用的方法:array.groupBy()和array.groupByToMap()。下面是数组。groupBy()方法按类别创建相同的组:constgroupByCategory=products.groupBy(product=>{returnproduct.category;});控制台日志(groupByCategory);//{//'fruits':[//{name:'apples',category:'fruits'},//{name:'oranges',category:'fruits'},//],//'蔬菜':[//{name:'potatoes',category:'vegetables'}//]//}products.groupBy(product=>{...})返回一个对象,其中每个属性的键作为类别名称和值作为包含相应类别产品的数组。使用products.groupBy()进行分组比使用product.reduce()需要更少的代码并且更容易理解。array.groupBy(callback)接受一个使用3个参数调用的回调函数:当前数组项、索引和数组本身。回调应该返回一个字符串:要添加项目的组名。constgroupedObject=array.groupBy((item,index,array)=>{//...returngroupNameAsString;});2.array.groupByToMap()有时你可能想使用一个Map而不是一个普通对象,因为一个Map是它接受任何数据类型作为键,但是普通对象仅限于字符串和符号。所以如果你想将数据分组到一个Map中,你可以使用方法array.groupByToMap()。array.groupByToMap(callback)的工作方式与array.groupBy(callback)完全相同,只是它将项目分组到Map而不是普通的JavaScript对象中。例如,要按类别名称将产品数组分组到地图中,请执行以下操作:constgroupByCategory=products.groupByToMap(product=>{returnproduct.category;});控制台日志(groupByCategory);//Map([//['fruits',[//{name:'apples',category:'fruits'},//{name:'oranges',category:'fruits'},//]],//['vegetables',[//{name:'potatoes',category:'vegetables'}//]//])3.结论如果你想轻松地对数组中的项目进行分组(类似于GROUPBYSQL),欢迎使用新方法array.groupBy()和array.groupByToMap()。这两个函数都接受一个回调,该回调应返回必须插入当前项目的组的键。array.groupBy()将项目组合成一个普通的JavaScript对象,而array.groupByToMap()将它们组合成一个Map实例。