【日常记录】【JS】对一个数组,按照某个字段的值,进行分组

文章目录

    • 1. 前言
    • 2. lodash 的分组
    • 3. Object.groupBy()
    • 参考链接

1. 前言

在开发中,经常会遇到一组数据,要按照某个字段进行分组,这个时候会有很多种方法,可以使用 forEachreduce、等其他方法

reduce 方法

function groupBy(arr, key) {return arr.reduce((acc, obj) => {const groupKey = obj[key];if (!acc[groupKey]) {acc[groupKey] = [];}acc[groupKey].push(obj);return acc;}, {});
}// 示例用法
const people = [{ id: 1, name: 'Alice', age: 25 },{ id: 2, name: 'Bob', age: 30 },{ id: 3, name: 'Charlie', age: 25 }
];const groupedByAge = groupBy(people, 'age');
console.log(groupedByAge);

在这里插入图片描述
在这里插入图片描述
forEach

function groupBy(arr, key) {const groups = {};arr.forEach(obj => {const groupKey = obj[key];if (!groups[groupKey]) {groups[groupKey] = [];}groups[groupKey].push(obj);});return groups;
}// 示例用法
const people = [{ id: 1, name: 'Alice', age: 25 },{ id: 2, name: 'Bob', age: 30 },{ id: 3, name: 'Charlie', age: 25 }
];const groupedByAge = groupBy(people, 'age');
console.log(groupedByAge);

其实都是一个逻辑,先定义一个对象,然后看看这个 key 在对象里面是否存在,存在的话,直接push,不存在 赋值一个新的数组

但一般项目中都会引入 lodash 这个库

2. lodash 的分组

安装方式

  1. 用前面提到的浏览器插件,直接任意一个网页的控制台安装 【日常记录】【插件】浏览器上的扩展 Console Importer
  2. 新建html 文件,通过 cdn 引入
  3. npm i 或者 yarn 、pnpm 等

在这里插入图片描述

_.groupBy([6.1, 4.2, 6.3], Math.floor);
// => { '4': [4.2], '6': [6.1, 6.3] }// The `_.property` iteratee shorthand.
_.groupBy(['one', 'two', 'three'], 'length');
// => { '3': ['one', 'two'], '5': ['three'] }

lodash 的 分组方法封装的更好

3. Object.groupBy()

js 自己也有了分组的方法:Object.groupBy()

静态方法根据提供的回调函数返回的字符串值对给定可迭代对象中的元素进行分组。返回的对象具有每个组的单独属性,其中包含组中的元素的数组。

参数

  • items:即将进行元素分组的可迭代对象,如数组
  • callbackFn:对可迭代对象中的每个元素执行的函数。它应该返回一个值,可以被强制转换成属性键(字符串或 symbol),用于指示当前元素所属的分组。
    • element:数组中当前正在处理的元素
    • index:正在处理的元素数组中的索引

返回值

一个带有所有分组属性的 null 原型对象,每个属性都分配了一个包含相关组元素的数组

示例

const inventory = [{ name: "芦笋", type: "蔬菜", quantity: 5 },{ name: "香蕉", type: "水果", quantity: 0 },{ name: "山羊", type: "肉", quantity: 23 },{ name: "樱桃", type: "水果", quantity: 5 },{ name: "鱼", type: "肉", quantity: 22 },
];Object.groupBy(inventory, ({ type }) => type);

在这里插入图片描述

/* 结果是:
{蔬菜: [{ name: "芦笋", type: "蔬菜", quantity: 5 },],水果: [{ name: "香蕉", type: "水果", quantity: 0 },{ name: "樱桃", type: "水果", quantity: 5 }],肉: [{ name: "山羊", type: "肉", quantity: 23 },{ name: "鱼", type: "肉", quantity: 22 }]
}
*/

需要注意的是:这是一项实验性技术。

在这里插入图片描述
在这里插入图片描述

参考链接

  • 【日常记录】【插件】浏览器上的扩展 Console Importer
  • Object.groupBy MDN

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

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

相关文章

LLama 405B 技术报告解读

LLama 405B 技术报告解读 果然传的消息都是真的,meta在24号凌晨发布了llama 3的405B版本,这次还是做一个技术报告解读。 值得一提的是,在技术报告的开头,meta特意强调了一个 Managing complexity,大意是管控复杂度。…

主题公园- 海豹主题式风格餐厅设计【AIGC应用】

业务背景:海洋馆针对细分客群增设一个打卡主题点位,以海豹主题式餐厅为打卡卖点,效果参见海豹主题式风格。 AIGC概念图制作平台:(可灵) https://klingai.kuaishou.com/ 关键词: 海豹主题餐厅…

Blender插入关键帧的位置报错

在操作过程中,有时候是误操作或者是做动画选择了活动插帧集,导致按i键插入关键帧一直报提示:插入关键帧的帧位置或者是其他的报错弹窗。 1、解决方法是:在时间线的抠像(插帧)选项里,将活动插帧集给清空 2、若是骨骼动画…

Ubuntu 修改源地址

注意事项:版本说明!!! Ubuntu24.04的源地址配置文件发生改变。 不再使用以前的 sources.list 文件,该文件内容变成了一行注释: # Ubuntu sources have moved to /etc/apt/sources.list.d/ubuntu.sources…

操作系统面试知识点总结2

#来自ウルトラマンメビウス(梦比优斯) 1 进程与线程 1.1 进程的概念和特征 更好地描述和控制程序并发执行,实现操作系统的并发性和共享性。 进程控制块(PCB):更好的描述进程的基本情况和运行状态&#xff…

Eclipse 搭建 C/C++ 开发环境以及eclipse的使用

一、下载、安装 MinGW 1、下载: 下载地址:MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 点击“Download Latest Version”即可 下载完成后,得到一个名为 mingw-get-setup.exe 的安装文件。双击运行,安装即可。 …

大数据、区块链与人工智能

大数据、区块链与人工智能:技术融合与未来展望 摘要 本文旨在探讨大数据、区块链和人工智能这三个技术领域的基本概念、发展历程、应用场景及其相互之间的融合。文章首先分别介绍这三个技术的定义和特点,然后分析它们在不同行业中的实际应用&#xff0…

Llama 3.1发布,性能媲美最强闭源大模型

美国太平洋时间 7 月 23 日,Meta 公司发布了其最新的 AI 模型 Llama 3.1,这是一个里程碑时刻。Llama 3.1 的发布让我们看到了开源 LLM 有与闭源 LLM 一较高下的能力。 Meta 表示,“到目前为止,开源 LLM 在功能和性能方面大多落后于…

C++高性能通信:了解Iceoryx与零拷贝技术的实现与应用

文章目录 0. 引言1. Iceoryx使用到的零拷贝技术1.1 零拷贝技术概述1.2 零拷贝的优势1.3 Iceoryx零拷贝的实现1.4 信息轮询与信号触发 2. Iceoryx的核心概念3. Iceoryx使用示例3.1 发布者程序3.2 订阅者程序3.3 编译和运行3.4 压力测试脚本 4. 参考文章 0. 引言 Iceoryx是一个开…

星环科技携手东华软件推出一表通报送联合解决方案

随着国家金融监督管理总局“一表通”试点工作的持续推进,星环科技携手东华软件推出了基于星环科技分布式分析型数据库ArgoDB和大数据基础平台TDH的一表通报送联合解决方案,并已在多地实施落地中得到充分验证。 星环科技与东华软件作为战略合作伙伴&…

深度学习复盘与论文复现E

文章目录 一、项目复现的问题及其解决方案1、 Cannot find DGL C graphbolt library2、 “is“ with a literal. Did you mean ““?”3、运行SEG、SPG查看GATNet的网络结构4、关于LI-FPN项目找不到数据粒度不匹配问题5、关于LI-FPN项目num_samples为空6、解决路径问题7、 !ss…

Java | Leetcode Java题解之第273题整数转换英文表示

题目: 题解: class Solution {String[] singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] t…

PHP基础语法(四)

一、字符串类型 1、字符串定义语法 1)单引号字符串:在单引号内部,所有的字符都会按照字面意义解释,不会进行变量替换或转义处理,除了 \ 表示单引号本身。 $str1 Hello, World!;2)双引号字符串&#xff…

数据库——单表查询

一、建立数据库mydb8_worker mysql> use mydb8_worker; 二、建立表 1.创建表 mysql> create table t_worker(department_id int(11) not null comment 部门号,-> worder_id int(11) primary key not null comment 职工号,-> worker_date date not null comment…

qt SQLite学习记录

1. 查看qt中数据库的驱动的类型的支持 QStringList drivers QSqlDatabase::drivers();//获取qt中所支持的数据库驱动类型foreach(QString driver,drivers){qDebug()<<driver;}2. Qt SQL 模块包含的主要类的功能介绍 Qt SQL 模块包含了一些主要的类&#xff0c;用于在 …

传输层协议——TCP

TCP协议 TCP全称为“传输控制协议”&#xff0c;要对数据的传输进行一个详细的控制。 特点 面向连接的可靠性字节流 TCP的协议段格式 源/目的端口&#xff1a;表示数据从哪个进程来&#xff0c;到哪个进程4位首部长度&#xff1a;表示该TCP头部有多少字节&#xff08;注意它…

大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

SQL注入万字详解,基于sqli-labs(手注+sqlmap)

目录 一、什么是SQL 1.什么是SQL 2.SQL的作用 3.MySQL基础知识 4.SQL增、删、改语句 *5.SQL查询语句 二、什么是SQL注入 1.SQL注入原理&#xff1a; 2.SQL注入&#xff1a; 3.SQL注入危害&#xff1a; 4.SQL注入技术分类&#xff1a; 5.防御方法&#xff1a;使用参…

javaEE-01-tomcat

文章目录 javaWebTomcat启动 Tomcat 服务器测试服务器是否成功停止tomcat服务器修改服务器的端口号 Idea整合tomcat服务器 javaWeb 所有通过 Java 语言编写可以通过浏览器访问的程序的总称,是基于请求和响应来开发的。 请求: 客户端给服务器发送数据(Request)响应: 服务器给客…

萝卜快跑:自动驾驶的先锋与挑战

萝卜快跑&#xff1a;自动驾驶的先锋与挑战 近段时间&#xff0c;由萝卜快跑引发的自动驾驶事件如火如荼&#xff0c;成为科技领域的热门话题。萝卜快跑作为自动驾驶领域的重要参与者&#xff0c;其最新事件引发了广泛的关注和讨论。 萝卜快跑是百度推出的自动驾驶出行服务平台…