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

【日常记录】【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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flutter 使用 url_launcher的canLaunchUrl() 方法总是返回false错误
  • 如何用JavaScript实现视频观看时间追踪
  • lua 游戏架构 之 游戏 AI (六)ai_auto_skill
  • PCB工艺边设计准则
  • WebRTC与orange pi实现视频画面实时传输
  • arinc664总线协议
  • HarmonyOS Next 省市区级联(三级联动)筛选框
  • Golang AES 对称加密
  • Flutter开发Dart 中的 mixin、extends 和 implements
  • Linux--网络基础
  • 设计模式 之 —— 单例模式
  • 数据库系列
  • ZLMRTCClient配置说明与用法(含示例)
  • web前端 React 框架面试200题(三)
  • pytest+allure
  • 分享的文章《人生如棋》
  • [NodeJS] 关于Buffer
  • 【技术性】Search知识
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • java 多线程基础, 我觉得还是有必要看看的
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • nodejs:开发并发布一个nodejs包
  • node入门
  • Objective-C 中关联引用的概念
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • webgl (原生)基础入门指南【一】
  • 初识 webpack
  • 初探 Vue 生命周期和钩子函数
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 给新手的新浪微博 SDK 集成教程【一】
  • 机器学习中为什么要做归一化normalization
  • 力扣(LeetCode)357
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​什么是bug?bug的源头在哪里?
  • # include “ “ 和 # include < >两者的区别
  • #define,static,const,三种常量的区别
  • #pragma multi_compile #pragma shader_feature
  • #每日一题合集#牛客JZ23-JZ33
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (十八)SpringBoot之发送QQ邮件
  • (十六)Flask之蓝图
  • (算法二)滑动窗口
  • (转载)从 Java 代码到 Java 堆
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually