当前位置: 首页 > news >正文

高阶函数之-数据分组的思考

看一个例子,刚开始,你可能会这样写

constpeople=[{name:'ALice',age:30,sex:'female'},{name:'BOb',age:25,sex:'male'},{name:'Chartlie',age:30,sex:'male'},{name:'Diana',age:25,sex:'female'},{name:'Eva',age:25,sex:'female'},{name:'Frank',age:25,sex:'male'},{name:'Grace',age:20,sex:'female'},];// 按年龄分组constresult={};for(constitemofpeople){constkey=item.age;if(!result[key]){result[key]=[];}result[key].push(item);}

但有一天可能按照性别分组,你不得不重新写一下代码,改成下面这样

constpeople=[{name:'ALice',age:30,sex:'female'},{name:'BOb',age:25,sex:'male'},{name:'Chartlie',age:30,sex:'male'},{name:'Diana',age:25,sex:'female'},{name:'Eva',age:25,sex:'female'},{name:'Frank',age:25,sex:'male'},{name:'Grace',age:20,sex:'female'},];// 按年龄分组// const result = {};// for(const item of people){// const key = item.age;// if(!result[key]){// result[key]=[];// }// result[key].push(item);// }// 按性别分组constresult={};for(constitemofpeople){constkey=item.sex;if(!result[key]){result[key]=[];}result[key].push(item);}

此时,我们应该想到应该写一个通用的分组函数来完成分组操作

//分组函数functiongroupBy(arr,propName){constresult={};for(constitemofarr){constkey=item[propName];if(!result[key]){result[key]=[];}result[key].push(item);}returnresult}constresult1=groupBy(people,'age')constresult2=groupBy(people,'sex')

此时到这还没结束,可能有一天我们那个数组的某个元素又是一个对象的话,比如address:{province:"河南’,city:‘开封’},我们可能想按照省份分组又该怎么做呢,再比如如果是按照年龄加上性别来分组,还有可能按照分组的数据是一个数字,让他按照奇偶数来分组又应该如何做呢,这个函数又用不了了,那么如何能让该函数更加的通用适应所有的分组操作呢,其实关键就在于那个键值key,他不应该仅仅是一个字符串,他的获取应该是一个过程,获取属性名来得到键只是这种过程中的一种,那么考虑到这一点,我们发现,他应该是一个函数才对,

//分组函数functiongroupBy(arr,generateKey){constresult={};for(constitemofarr){constkey=generateKey(item);if(!result[key]){result[key]=[];}result[key].push(item);}returnresult}// 按年龄constresult1=groupBy(people,(item)=>item.age)// 按性别constresult2=groupBy(people,(item)=>item.sex)// 按年龄-性别constresult3=groupBy(people,(item)=>`${item.age}-${item.sex}`)// 如果数组是存数字constarr=[34,6,321,3,5,7];constresult4=groupBy(arr,(item)=>item%2===0?'偶':'奇')

那么这个函数在功能上是没有什么问题了,但是在使用上还不那么舒服,我们希望他支持两种方式来传递,第一种按照属性名来分组,第二种按照函数来,那么这个参数就出现了两种情况,那么就需要用到参数归一化了

//分组函数functiongroupBy(arr,generateKey){if(typeofgenerateKey==='string'){constpropName=generateKey;generateKey=(item)=>item[propName]}constresult={};for(constitemofarr){constkey=generateKey(item);if(!result[key]){result[key]=[];}result[key].push(item);}returnresult}// 按年龄constresult1=groupBy(people,'age')// 按性别constresult2=groupBy(people,'sex')// 按年龄-性别constresult3=groupBy(people,(item)=>`${item.age}-${item.sex}`)// 如果数组是存数字constarr=[34,6,321,3,5,7];constresult4=groupBy(arr,(item)=>item%2===0?'偶':'奇')

非原创,来自渡一袁老师,简单记录,每日分享

http://www.cnnetsun.cn/news/3932.html

相关文章:

  • Wan2.2-T2V-5B能否理解‘慢动作’‘快进’等时间修饰词?
  • 终极CotEditor开源贡献完整指南:从入门到精通
  • 千万别信!留学生求职辅导真的管用吗?
  • ESD保护器件基础选型指南:从参数到实战
  • 系统级ESD防护设计:超越单一器件的思考
  • PHP实现电商GraphQL API的8个避坑指南(资深架构师亲授)
  • 安全加固后SSH无法远程登陆的主要原因
  • 解锁心理占星认证之路:为何新月文化的国际认证成为副业发展的首选平台?
  • FOC控制(仿真+硬件+软件)
  • 智能科学毕设简单的课题建议
  • Wan2.2-T2V-A14B如何识别并规避敏感内容生成?
  • Wan2.2-T2V-5B在智能客服视频回复系统中的集成构想
  • Wan2.2-T2V-5B支持与大语言模型联动生成脚本+视频
  • 惊呆了!用原生JS实现拖放,竟比你想象的简单100倍!
  • JavaScript Notifications API:告别alert弹窗,开启沉浸式用户体验革命!
  • Wan2.2-T2V-A14B支持昼夜交替与时间流逝效果模拟
  • WanVideo_comfy:革命性AI视频创作框架深度解析
  • 分布式系统元数据高可用:Apache Doris如何实现99.99%可用性保障
  • 超800万罚单再敲警钟:合规无小事,智慧法务成企业“必答题”
  • 计算机毕设java高校宿舍管理系统 基于Java的高校宿舍信息化管理平台设计与实现 Java技术驱动的高校宿舍管理系统开发与应用
  • 强化学习7倍速提速方法:从单核蜗牛到多核猎豹
  • Python跨平台剪贴板操作终极指南:快速实现文本复制粘贴
  • TinyMCE6处理OA系统word文档批量上传
  • 美股Tick数据获取方式汇总
  • 终极文件解压工具与二维码生成器:跨平台完整指南
  • 突破传统:WheelPicker轮盘组件如何重塑Android应用交互体验
  • Readest翻页动画系统:打造沉浸式数字阅读体验的完整指南
  • Rust机器学习框架Candle:打破Python垄断的终极武器
  • 基于Vue.js的企业级数据可视化架构设计与实践
  • Laravel 13多模态表单处理:3个你必须掌握的高级技巧,否则将落后同行2年