JS数据分组引发的思考

我们经常需要对数据进行分组(分类),得到需要的格式。

1.简单示例

例如有一份对象数组的数据

const data = [{ name: 'Liam', age: 18, sex: 'male' },{ name: 'Bob', age: 20, sex: 'male' },{ name: 'Diana', age: 21, sex: 'female' },{ name: 'Grace', age: 20, sex: 'female' }
]

现在需要根据年龄进行分组,通常会写出这份代码,为了方便复用封装成函数。

function groupBy(arr, propName) {const result = arr.reduce((obj, item) => {const key = item[propName]if (!obj[key]) {obj[key] = []}obj[key].push(item)return obj}, {})return result
}
// 按年龄分组
console.log(groupBy(data, 'age'))

在这里插入图片描述

2.问题出现

如果需要根据年龄+性别进行分组,如’18-male’,会发现上面groupBy函数中无法正常获取到key。
或者进行分组的数据,对象里面的某个属性值是一个对象,例如下面这份数据,address是一个对象,包括province-省份、city-城市,我们需要通过省份进行分组,key也是无法正常获取到的。

const data = [{name: 'Liam',age: 18,sex: 'male',address: {province: '广东省',city: '广州市'}},{name: 'Bob',age: 20,sex: 'male',address: {province: '广东省',city: '佛山市'}},{name: 'Diana',age: 21,sex: 'female',address: {province: '江苏省',city: '常熟市'}},{name: 'Grace',age: 20,sex: 'female',address: {province: '四川省',city: '自贡市'}}
]

3.分组函数改造

接下来将对前面简单封装的函数进行改造,以适应所有的分组操作,问题在于如何正确获取到分组的key值,因此将函数的第二个参数(propName) 改为传入一个函数(generateKey),调用函数生成key。

function groupBy(arr, generateKey) {const result = arr.reduce((obj, item) => {// 获取keyconst key = generateKey(item)if (!obj[key]) {obj[key] = []}obj[key].push(item)return obj}, {})return result
}
  • 尝试按年龄+性别分组,处理正常
console.log(groupBy(data, (item) => `${item.age}-${item.sex}`))

在这里插入图片描述

  • 尝试按省份分组,处理正常
console.log(groupBy(data, (item) => item.address.province))

在这里插入图片描述

4.调用优化

分组函数的功能已经完成,大多数情况下,我们只需要根据对象中的顶层属性进行分组,例如一开始的根据年龄分组,所以还可以对函数调用进行简化,第二个参数支持传入函数外,支持直接传入字符串。

function groupBy(arr, generateKey) {// 参数归一化if (typeof generateKey === 'string') {const propName = generateKeygenerateKey = (item) => item[propName]}const result = arr.reduce((obj, item) => {// 获取keyconst key = generateKey(item)if (!obj[key]) {obj[key] = []}obj[key].push(item)return obj}, {})return result
}

5.完整代码

const data = [{name: 'Liam',age: 18,sex: 'male',address: {province: '广东省',city: '广州市'}},{name: 'Bob',age: 20,sex: 'male',address: {province: '广东省',city: '佛山市'}},{name: 'Diana',age: 21,sex: 'female',address: {province: '江苏省',city: '常熟市'}},{name: 'Grace',age: 20,sex: 'female',address: {province: '四川省',city: '自贡市'}}
]function groupBy(arr, generateKey) {// 参数归一化if (typeof generateKey === 'string') {const propName = generateKeygenerateKey = (item) => item[propName]}const result = arr.reduce((obj, item) => {// 获取keyconst key = generateKey(item)if (!obj[key]) {obj[key] = []}obj[key].push(item)return obj}, {})return result
}// 按年龄分组
console.log(groupBy(data, (item) => item.age))// 按年龄+性别分组
console.log(groupBy(data, (item) => `${item.age}-${item.sex}`))// 按省份分组
console.log(groupBy(data, (item) => item.address.province))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生丶Kubernetes】Kubernetes初体验

人生若只如初见,何事秋风悲画扇。 前言 Kubernetes 是目前最流行的容器编排工具之一,由Google开发并维护。它提供了完整的容器编排解决方案,包括自动化部署、资源管理和调度、服务发现和负载均衡等功能。 然而,对于初学者来说&a…

【Linux】文件描述符(下篇)

文章目录 📖 前言1. 文件描述符fd的分配规则2. 重定向的本质3. 缓冲区的理解3.1 感受缓冲区的存在:3.2 正式认识缓冲区:综合例题: 4. 模拟实现C语言的文件操作5. 完善之前实现的shell5.1 程序替换,会影响曾经子进程打开…

决策树 ID3 手工推导

掌握决策树ID3算法的原理,通过增益熵实现手工推导的过程。 参考案例:https://cuijiahua.com/blog/2017/11/ml_2_decision_tree_1.html 机器学习实战教程(二):决策树基础篇之让我们从相亲说起 决策树 ID3 手工推导 决策树 ID3 简介 ID3作为一种…

多个微信号如何管理?

很多公司都在发愁这几个问题: 1、拥有多个微信号,不想管理多台手机,想将所有微信号进行统一管理 2、想用软件来代替传统的营销体系,安全性上也要有保障 3、用人成本太大与公司的效益不成正比 4、多个账号发圈不方便&#xff0…

Neo4j docker 部署

想要运行简单测试一下neo4j,就直接使用docker创建了一个容器,并用cypher-shell本地连接neo4j,创建图进行测试。 1 开启docker sudo systemctl start docker2 拉取镜像源 sudo docker pull neo4j # 默认latest版本3 查看本地镜像&#xff0…

ElasticSearch学习02——Kibana安装

ElasticSearch学习02——Windows下Kibana安装 Kibana是界面化的查询数据的工具,下载时尽量下载与ElasicSearch一致的版本。 1、下载对应版本的Kibana ​ 有了ElasticSearch安装的经验,我们发现了ES和JDK有着版本对应的关系,Kibana和ES共同为…

【机器学习】支持向量机(上)

支持向量机(上) 目录 一、导言二、何为支持向量机三、点到平面的距离计算四、构建目标函数(支持向量机的基本型推导)五、利用 KKT 条件对目标函数进行转换1、拉格朗日乘数法的引入2、KKT 条件的引入3、松弛互补条件的引入4、总结 …

交叉熵损失CrossEntropyLoss

交叉熵损失CrossEntropyLoss 语义分割网络输出tensor的尺寸为【B,C,H,W】,进行多分类,label的尺寸为【B,H,W】。 举例:三分类:output【1, 3,3, 3】,label【1, 3, 3】 验证 import torchoutput torch.tensor([[[[1, 1…

数据挖掘与数据分析之统计知识篇

1、自由度是什么?怎么确定? 统计学上,自由度是指当以样本的统计量估计总体的参数时,样本中独立或能自由变化的数据个数叫自由度。一般来说,自由度等于独立变量减掉其衍生量数。举例来说,变异数的定义是样本…

【Linux | Shell命令】Linux 环境变量

目录 一、概述二、什么是环境变量2.1 全局环境变量2.2 局部环境变量 三、设置用户自定义变量3.1 设置局部用户自定义变量3.2 设置全局环境变量3.3 删除环境变量 四、默认的 shell 环境变量五、5.1 设置 PATH 环境变量5.2 一、概述 Linux 系统中,很多程序和脚本通过环…

海康监控摄像机接入NTV GBS GB28181平台实现远程调取监控视频

海康威视各种型号监控摄像头或硬盘录像机(NVR/HVR)接入NTV GBS GB28181平台配置过程都非常简单明了,但有些细节需要注意,避免走弯路踩泥坑。 1、基本要求 1)网络要求 总体来说,只要监控设备和GB28181平台的网络是连通的,设备可以主…

ADS笔记,时域和频域绘图

为防止遗忘,记录一下ADS的时间域和频谱图的绘制 在ADS中想得到电路的时域和频域图的话,可以用谐波平衡仿真HB或者选择一个准瞬态仿真控制器插入到原理图中来实现。 目录 方法一:谐波平衡仿真HB时域设置频域设置 方法二:准瞬态仿…