网站首页 > 技术文章 正文
在业务开发中,经常会遇见数组分类,一般情况下,我们都是根据具体业务场景来进行数据分类,但这种方式不够灵活,今天分享一种可以支持多场景实现分类数组的方法,方法很简单,主要是提供一种跳出具体业务场景的思维方式
比如对以下数据进行各种维度的分类,比如年龄,性别,年龄+性别等等
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数组的简单排序
- 最近发表
-
- count(*)、count1(1)、count(主键)、count(字段) 哪个更快?
- 深入探索 Spring Boot3 中 MyBatis 的 association 标签用法
- js异步操作 Promise fetch API 带来的网络请求变革—仙盟创梦IDE
- HTTP状态码超详细说明_http 状态码有哪些
- 聊聊跨域的原理与解决方法_跨域解决方案及原理
- 告别懵圈!产品新人的接口文档轻松入门指南
- 在Javaweb中实现发送简单邮件_java web发布
- 优化必备基础:Oracle中常见的三种表连接方式
- Oracle常用工具使用 - AWR_oracle工具有哪些
- 搭载USB 3.1接口:msi 微星 发布 990FXA Gaming 游戏主板
- 标签列表
-
- 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)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)