网站首页 > 技术文章 正文
在业务开发中,经常会遇见数组分类,一般情况下,我们都是根据具体业务场景来进行数据分类,但这种方式不够灵活,今天分享一种可以支持多场景实现分类数组的方法,方法很简单,主要是提供一种跳出具体业务场景的思维方式
比如对以下数据进行各种维度的分类,比如年龄,性别,年龄+性别等等
const people = [
  {name: 'John', age: 25,sex:'male'},
  {name: 'Jane', age: 30,sex:'female'},
  {name: 'Bob', age: 25,sex:'male'},
  {name: 'Alice', age: 30,sex:'female'},
  {name: 'Tom', age: 25,sex:'male'},
  {name: 'Jerry', age: 30,sex:'female'},
  {name: 'Mike', age: 25,sex:'male'},
  {name: 'Lucy', age: 30,sex:'female'},
  {name: 'Jack', age: 25,sex:'male'},
  {name: 'Mary', age: 32,sex:'female'},
  {name: 'Peter', age: 25,sex:'male'},
]代码实现
//arr 数据源
//generateKey 一个可以生成分类键值的方法或者字符串
//根据键值来进行分类
function groupBy(arr,generateKey) {
  //分类之后的返回数据
  const result = {}
  if(!Array.isArray(arr)){
    throw new TypeError('arr is not an array')
  }
  //分类键值判断
  //判断键值是字符还是fn
  if(typeof generateKey=== 'string'){
    let key = generateKey
    generateKey = (item)=>item[key]
  }
  for (let i = 0; i < arr.length; i++) {
    //获取分类键值
    const key = generateKey(arr[i],i,arr)
    if (!result[key]) {
      result[key] = []
    }
    result[key].push(arr[i])
  }
  return result
}执行(多场景数据分类)
//generateKey 为fn
const r = groupBy(people,item=>item.age)
console.log('r-age',r)
//generateKey 为string
const r1 = groupBy(people,'sex')
console.log('r-sex',r1)
//generateKey 为fn
const r2 = groupBy(people,item=>item.age>25?'old':'young')
console.log('r-old-young',r2)
//generateKey 为fn
const r3 = groupBy(people,item=>`${item.age}-${item.sex}`)
console.log('r-age-sex',r3)数据结果
- generateKey 为 (item)=>item.age
 
- generateKey 为 sex
 
- generateKey 为 (item)=>item.age>25?'old':'young')
 
- generateKey 为 (item)=>`${item.age}-${item.sex}`
 
其他数据分类
const r4 = groupBy([0,1,2,3,4,5,6],(item)=>item%2===0?'even':'odd')
//r-奇偶分类 { even: [ 0, 2, 4, 6 ], odd: [ 1, 3, 5 ] }猜你喜欢
- 2025-01-13 JavaScript数组之map、filter、reduce使用详解
 - 2025-01-13 帮你精通JS:解析与盘点数组array的5类22种方法
 - 2025-01-13 JS几种数组遍历方式以及性能分析对比
 - 2025-01-13 JS数组过滤元素的方法
 - 2025-01-13 js中的数组拷贝(浅拷贝,深拷贝)
 - 2025-01-13 js常用数组API方法汇总
 - 2025-01-13 JS怎么实现有序数组合并?
 - 2025-01-13 JavaScript数组剖析
 - 2025-01-13 JavaScript重构技巧—数组,类名和条件
 - 2025-01-13 JavaScript数组的简单排序
 
- 最近发表
 - 
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
 - [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
 - 超详细手把手搭建在ubuntu系统的FFmpeg环境
 - Nginx运维之路(Docker多段构建新版本并增加第三方模
 - 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
 - Go 人脸识别教程_piwigo人脸识别
 - 安卓手机安装Termux——搭建移动服务器
 - ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
 - Rust开发环境搭建指南:从安装到镜像配置的零坑实践
 - Windows系统安装VirtualBox构造本地Linux开发环境
 
 
- 标签列表
 - 
- cmd/c (90)
 - c++中::是什么意思 (84)
 - 标签用于 (71)
 - 主键只能有一个吗 (77)
 - c#console.writeline不显示 (95)
 - pythoncase语句 (88)
 - es6includes (74)
 - sqlset (76)
 - apt-getinstall-y (100)
 - node_modules怎么生成 (87)
 - chromepost (71)
 - flexdirection (73)
 - c++int转char (80)
 - mysqlany_value (79)
 - static函数和普通函数 (84)
 - el-date-picker开始日期早于结束日期 (76)
 - js判断是否是json字符串 (75)
 - c语言min函数头文件 (77)
 - asynccallback (87)
 - localstorage.removeitem (77)
 - vector线程安全吗 (73)
 - java (73)
 - js数组插入 (83)
 - mac安装java (72)
 - 无效的列索引 (74)
 
 
