ECMAScript 悄悄更新了两个对象分组 API,你注意到了么?

前端必知必会-JavaScript Map 方法 本文介绍了JavaScript Map 方法的使用,如有问题欢迎私信和评论。 阅读详情

本文由体验技术团队小汪同学分享~


摘要:“ Map.groupBy() 静态方法使用提供的回调函数返回的值对给定可迭代对象中的元素进行分组。最终返回的 Map 使用测试函数返回的唯一值作为键,可用于获取每个组中的元素组成的数组。
详见: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy ”

哈喽,各位小伙伴们大家好呀~

今天和大家聊一下谷歌在117版本更新的两个 API。

Object.groupBy 和 Map.groupBy

在日常的开发实践中,数据分组是一个很常用的操作。一般情况下,我们需要编写自定义的分组函数或者借助于三方库中的 groupBy 函数来实现。不过,有个激动人心的好消息:ECMAScript 更新了两个原生的分组方法——Object.groupBy 和 Map.groupBy。

让我们来回忆一下,在以往的开发过程中,我们是怎么自定义数组分组方法的。假设我们有一个由员工对象组成的数组,并且我们希望按照年龄来对这些员工进行分组。以往,我们可能会使用 forEach 循环来达到目的,相关代码如下所示:

const members = [
    { name: "HuaXiaoWen", age: 23 },
    { name: "HuaXiaoMing", age: 25 },
    { name: "HuaXiaoGang", age: 23 },
];

const membersGroupByAge = {};

members.forEach((member) => {
    const age = member.age;
    if (!membersGroupByAge[age]) {
        membersGroupByAge[age] = [];
    }
    membersGroupByAge[age].push(member);
});

console.log(membersGroupByAge);

执行上述代码,我们会得到以下的输出结果:

{  
    "23": [  
        {  
            "name": "HuaXiaoWen",  
            "age": 23  
        },  
        {  
            "name": "HuaXiaoGang",  
            "age": 23  
        }  
    ],  
    "25": [  
        {  
            "name": "HuaXiaoMing",  
            "age": 25  
        }  
    ]  
}

此外,我们也可以选择使用 reduce 方法来完成同样的任务:

const membersGroupByAge = members.reduce((accumulator, member) => {
    const age = member.age;
    if (!accumulator[age]) {
        accumulator[age] = [];
    }

    accumulator[age].push(member);
    return accumulator;
}, {});

显而易见的,无论是哪一种方法,代码都显得有些冗余且不够简洁。每当分组时,我们都需要检查分组键的值是否出现过,如果没出现过,则需要初始化一个空数组,并将符合条件的元素逐一添加进去。在这种实现下,代码的语义就会略显冗余。

使用 Object.groupBy 分组

Object.groupBy 方法,提供了一个直观的数组分组手段,不仅简化了开发者编写代码的过程,而且也使代码具有更好的可读性。利用这一新方法,我们可以非常方便地按照指定的属性对数组中的对象进行分组。

const membersGroupByAge = Object.groupBy(members, (member) => member.age);

通过上示代码,我们就可以轻松实现数据分组操作。

然而,值得我们注意的是,使用 Object.groupBy 方法返回的对象是一个“纯净”的对象——即没有继承任何原型链上的属性或方法。这一点非常关键,因为它意味着常见的 Object.prototype 方法,如 hasOwnProperty 或 toString,不会在这个对象上直接可用。虽然这样做有其好处,比如防止了属性名冲突的可能性,但同时也意味着我们在处理返回的分组对象时不能直接使用这些内置方法。例如:

const membersGroupByAge = Object.groupBy(members, (member) => member.age);

// 下面的代码会抛出错误,因为 `membersGroupByAge` 没有 `hasOwnProperty` 方法
console.log(membersGroupByAge.hasOwnProperty("28"));
// TypeError: membersGroupByAge.hasOwnProperty is not a function

// 即使用扩展运算符或者Object.assign来拷贝对象,新的对象仍然不会带有Object的方法
console.log({ ...membersGroupByAge }.hasOwnProperty("28"));
// TypeError: membersGroupByAge.hasOwnProperty is not a function

使用 Object.groupBy 时,需要注意回调函数应该返回 string 或 Symbol 类型的值,因为对象的 key 始终是 string 或 Symbol。如果回调函数返回其他类型的值(例如数字),key 值也会自动转换为字符串。在我们的例子中,即使 age 属性的值为数字,也会被转换为字符串类型,所以在访问该属性时需要注意这一点。

console.log(membersGroupByAge[23]); // 这是错误的访问方式,因为数字类型的键会被转换为字符串
// => undefined

console.log(membersGroupByAge["23"]); // 这才是正确的访问方式
// => [{"name":"HuaXiaoWen","age":23}, {"name":"HuaXiaoGang","age":23}]

使用 Map.groupBy 分组

Map.groupBy 方法,作为 ECMAScript 新特性的一员,与 Object.groupBy 承担着相似的职责,但它们返回的结果类型有所不同。Map.groupBy 方法的引入为开发者提供了更为灵活的数据结构——Map 对象。与返回普通对象的 Object.groupBy 相比,Map 对象具有一些独特的优势,特别是在进行键的比较时。

以如下代码为例,我们可以看到 Map.groupBy 方法如何根据个体的直接上级(汇报对象)来对人员进行分组:

const manager = { name: "HuaXiaoWen", age: 23, leader: null };
const develop = { name: "HuaXiaoMin", age: 25, leader: "manager" };
const member = [
    manager,
    develop,
    { name: "HuaXiaoGang", age: 25, leader: "manager" },
    { name: "HuaXiaoLiang", age: 23, leader: null }
];

const memberByLeader = Map.groupBy(members, (member) => member.leader);

在此示例中,我们依据每个人的领队来进行分组,得到的是一个 Map 对象,它以领队作为键,对应的直接下属列表作为值。但要注意,由于 Map 在进行键的比较时使用的是严格等价性检查(===),因此只有当两个对象的引用完全相同时,它们才被认为是等同的键。

memberByLeader.get(manager);
// => [{ name: "HuaXiaoWen", age: 23, leader: "manager" }, { name: "HuaXiaoGang", age: 23, leader: "manager" }]

memberByLeader.get({ name: "HuaXiaoWen", age: 23, leader: null });
// => undefined

浏览器兼容性

在近期的 JavaScript 发展趋势中,groupBy 方法作为 proposal-array-grouping 提案的一部分,已经引起了广泛关注。该提案目前正处在 ECMAScript 标准化进程的第三阶段,按照目前的进展,我们可以期待在2024年它能够正式纳入 ECMAScript 标准。

截至2023年12月4日,Google Chrome 浏览器的117版本已经率先支持了这一新特性,开发者可以在最新版的 Chrome 中体验到 Object.groupBy 和 Map.groupBy 方法。同时,Mozilla Firefox 的 Nightly 版本已在实验性质的标志后提供了这两个方法的实现。此外, Safari 浏览器也在其平台上以不同的命名实现了相似的功能。

这些方法在 Chrome 中的支持,意味着它们已经在 Google 的 V8引擎中得到了实现。V8引擎不仅是 Chrome 和 Chromium 浏览器的驱动核心,也是 Node.js 的基石。因此,随着 V8引擎的下一次更新,预计这些实用的 groupBy 方法也将很快在 Node.js 环境中可用。

在这里插入图片描述

为什么是 Object 的静态方法而不是 Array?

你可能会好奇为什么选择用 Object.groupBy 而不是像 Array.prototype.groupBy 这样的数组原型方法。

这是因为根据这个提案的说明,曾经有一个库尝试在 Array.prototype 上添加了一个不兼容的 groupBy 方法的补丁。出于向后兼容性的考虑,才将方法放在 Object.prototype 上。

JavaScript 向后兼容性是指在新版本的 JavaScript 中,旧版本的 JavaScript 代码仍然能够正常运行。这是非常重要的,因为很多网站和应用程序使用旧版本的 JavaScript 代码,在更新浏览器或者 JavaScript 引擎之后,这些代码可能会出现错误或者不兼容的情况。

1. 语言规范的兼容性: 新版本的 JavaScript 应该能够解析和执行旧版本的 JavaScript 代码,同时也应该保留旧版本的语言特性和语法规则。

2. API 的兼容性: 新版本的 JavaScript 应该保留旧版本的 API,使得旧版本的 JavaScript 应用程序能够正常运行,并且能够使用新版本的 API。

3. 浏览器兼容性: 新版本的 JavaScript 应该能够在各种浏览器中正常运行,同时也应该保留旧版本的浏览器兼容性,使得旧版本的 JavaScript 应用程序能够在不同的浏览器中正常运行。

类似的问题在之前尝试为 Array.prototype 添加 flatten 方法时也发生过,这导致了著名的“SmooshGate”争议。

简言之,通过采用静态方法,JavaScript 能够更加稳健地保持其向后兼容性,并且为将来可能引入的新功能和数据结构提供了更为灵活的扩展可能性。

关于 OpenTiny

在这里插入图片描述

OpenTiny 是一套企业级 Web 前端开发解决方案,提供跨端、跨框架、跨版本的 TinyVue 组件库,包含基于 Angular+TypeScript 的 TinyNG 组件库,拥有灵活扩展的低代码引擎 TinyEngine,具备主题配置系统TinyTheme / 中后台模板 TinyPro/ TinyCLI 命令行等丰富的效率提升工具,可帮助开发者高效开发 Web 应用。


欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~更多视频内容也可关注B站、抖音、小红书、视频号

OpenTiny 也在持续招募贡献者,欢迎一起共建

OpenTiny 官网:https://opentiny.design/
OpenTiny 代码仓库:https://github.com/opentiny/
TinyVue 源码:https://github.com/opentiny/tiny-vue
TinyEngine 源码: https://github.com/opentiny/tiny-engine
欢迎进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI~

如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

ECMAScript知识归纳 使用class定义类时,可以包含构造函数、实例方法、静态方法和访问器。解构赋值是一种语法,允许将对象或数组中的数据直接提取到变量中。这种方式使代码更加简洁直观,同时不会对被解构的目标对象或数组造成任何影响。Symbol是 ES6 新增的一种原始数据类型,用于创建独一无二的值。它通过Symbol()函数生成,每个Symbol值都是唯一的。设计初衷:为对象添加私有属性,防止属性名冲突或被外部访问。所有功能都集中在一个对象上,代码容易混乱且难以维护。基于传统的事件驱动模式,不支持现代的Promise。 阅读详情

相关推荐

ECMAScript 详解

ECMAScript 标准定义了 JavaScript 语言的核心功能和语法,而 JavaScript 则是 ECMAScript 标准的具体实现之一。虽然 ECMAScript 是一个标准规范,JavaScript 则是其最著名的实现,但请注意,JavaScript 实际上包含了更多由浏览器或其他宿主环境提供的额外功能,如DOM操作、BOM(浏览器对象模型)等,这些并不属于 ECMAScript 标准。TC39 是 Ecma 国际中的一个技术委员会,负责推动 ECMAScript 标准的发展。

数字人生 1940

ES2024新特性:object.groupBy()让分组更简单

2024年初,JavaScript(也称为Ecma Script)推出了一项全新的内置函数——object.groupBy()。这一创新功能将彻底改变我们对数据进行分组和组织的方式!什么是object.groupBy()?复杂定义:object.groupBy()是一个静态方法,允许你基于提供的回调函数对可迭代对象(如数组)中的元素进行分组。最终会生成一个新的对象,该对象的每个属性都是一个组,每个...

前端达人 1870

PT32F030与MT6826S SPI通讯实战:从硬件连接到数据交互全流程解析

本文详细解析了PT32F030与MT6826S通过SPI通讯的全流程,包括硬件连接、电路设计、SPI外设初始化配置以及数据交互协议实现。通过实战案例和代码示例,帮助开发者快速掌握PT32F030与MT6826S的SPI通讯技术,实现精准的角度和速度数据采集。

weixin_29189373的博客 420

JavaScript 终于原生支持数组分组了!

在日常开发中,很多时候需要对数组进行分组,每次都要手写一个分组函数,或者使用lodash的groupBy函数。和,以后再也不需要手写分组函数了,目前最新版本的 Chrome(117)已经支持了这两个方法!

公众号:前端充电宝 1157

数控弯管机xyz转换ybc的算法_花了一年时间开发的三维弯管机交互式转档软件(三维管子模型UG,SOLIDWORK,PRO/E文件转成YBC)...

在弯管机加工中,由管子模型生成可直接进行弯管加工的YBC数据可以大大提高弯管编程过程.传统的做法是先用dxf数据文件(用autocad绘制管子的轴心线数据)转出XYZ数据,然后由XYZ数据转成YBC数据,而且大部分厂家对文件版本以及软件做管方式都有不少限制,这大大花费了用户的时间跟精力.随着企业的信息化管理以及不断的技术升级,传统用autocad线条模式来描述管子的方式正在被用户用PRO/E,UG...

weixin_29065959的博客 1963

OrangePi Kunpeng Pro 安装 ROS2 + Gazebo

OrangePi Kunpeng Pro 的优点很明显,内置openEuler,配备PD电源,做到开箱即用;板子设计也不错,风扇噪音不大,散热良好,昇腾芯片又确保小板子的性能,接口丰富是这类板子共同的优点,也很好的继承了下来,甚至还可以外接固态,可靠性大大提升。使用起来,哪怕不用openEuler的话,也可以很方便的刷Ubuntu来实现一些需要依赖的开发工作,这次没有跑AI模型,所以对算力的优势还没有很明显的感受,下次可以试一下yolo跑跑看。

Arcan 1824

Object.groupBy分组方法

Object.groupBy分组方法

m0_47195133的博客 733

历年北京理工大学复试专业综合题

。

A place to record sth. 2万+

期待已久的 JS 原生 groupBy() 分组函数即将到来

在处理数组时,有时我们需要将其中的项目按照某个特定的属性或条件进行分类或分组。这个过程可能会多次重复,每次都需要编写分组函数或使用像 lodash 这样的库中的 groupBy 函数来完成。但是,现在 JavaScript 正在引入一种更方便的方法,让我们不再需要手动编写这些分组逻辑。JavaScript 引入了新的 Object.groupBy 和 Map.groupBy 方法,它们使得对数组进...

前端达人 531

V.PhyloMaker实战:从物种列表到维管束植物系统发育树的完整流程

本文详细介绍了使用V.PhyloMaker工具包,从物种列表快速构建维管束植物系统发育树的完整实战流程。内容涵盖R包安装、物种名标准化、核心函数phylo.maker的三种构建方案选择、结果树的可视化与导出,以及与picante包的联动分析,为生态学和生物地理学研究提供了高效解决方案。

weixin_29057237的博客 377

Navicat16/17数据库密码安全解析与实战解密指南

本文详细解析了Navicat 16/17版本中数据库密码的加密机制,并提供了实用的密码找回指南。通过导出连接文件获取加密密文,利用基于AES-128-CBC算法的本地HTML工具,可安全、离线地解密遗忘的密码。文章强调该方法仅适用于合法恢复自有密码,并给出了操作步骤与安全建议。

weixin_28835583的博客 467

深入解读 ECMAScript 与 JavaScript 的关系及最新更新

ECMAScript:由 ECMA 国际标准化组织制定的脚本语言标准。它定义了编程语言的语法、类型、语句、关键字、运算符、对象等基本元素,为脚本语言的实现提供了统一的规范。JavaScript:基于 ECMAScript 标准的编程语言实现。除了包含 ECMAScript 的所有特性外,JavaScript 还扩展了浏览器对象模型(BOM)和文档对象模型(DOM)等功能,使其能够与网页内容和浏览器进行交互。

进击的码农 1357

半小时搞定Yolov5安装配置及使用(详细过程)

Yolov51. 下载Yolov52. 安装Yolov5 在下载配置Yolov5前,先要安装好Anaconda环境,可参考之前博文:最新Anaconda3的安装配置及使用教程(详细过程) 1. 下载Yolov5 首先下载Yolov5源码: Yolov5 Github地址:https://github.com/ultralytics/yolov5 直接git clone到本地工作目录,等待下载完成: Yolov5代码目录架构: 2. 安装Yolov5 源码下完后,下面开始安装Yolov5所需模块,

HowieXue 薛永浩的博客 12万+

ECMAScript 与 JavaScript区别与联系

本文详细探讨了 ECMAScript 和 JavaScript 之间的区别与联系。首先,文章介绍了 JavaScript 的起源和发展,以及它作为一种多范式编程语言的特点。接着,解释了 ECMAScript 作为标准化脚本语言规范的角色,以及其版本更新的规律。通过对比 ECMAScript 和 JavaScript 的定义、关系、版本、实现差异等方面,本文帮助读者理解两者的本质区别和相互关系。

weixin_45511682的博客 1782

UE5实现建筑剖切效果

UE5实现建筑剖切效果

专注GIS开发 8463

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ECMAScript 与JavaScript 的区别 及ECMAScript 新特性

简单来说,两者的区别:ECMAScript 是语言规范,JavaScript 是编程语言。 ECMAScript 的新特性:不同的时间有不同的新特性加入,比如ES5、ES6/ES2015、ES7/ES2016、ES2018等等,常被大家熟知的ES6是一个重要的更新,所以这个比较重要。这里主要对ES6以来的一些新特性进行了总结和记录,查漏补缺吧。

鹤渺的星球 1651

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ECMAScript和JavaScript区别

ECMAScript:ECMAScript是一种由Ecma International(欧洲计算机制造商协会)制定的脚本语言规范。它不是一种具体的编程语言,而是一种为各种脚本语言提供统一基础和高层次抽象的规范。ECMAScript定义了脚本语言的语法、类型、语句、关键字、保留字、运算符、对象等核心要素,为各种环境下的脚本语言提供了共同的基础和标准。JavaScript。

Chujun123528的博客 1624

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ECMAScript与JavaScript的区别详解

ECMAScript是由欧洲计算机制造商协会(ECMA,European Computer Manufacturers Association)制定的一种脚本语言标准,最初是为了标准化JavaScript语言而设立的。其最早版本发布于1997年,最初的版本命名为ECMA-262。JavaScript是一种轻量级的脚本语言,最早由Netscape公司在1995年开发,用于增强网页的互动功能。最初的名字叫Mocha,后来改名为LiveScript,最终在与Sun Microsystems合作后定名为。

2301_78944833的博客 1269

ECMAScript与JavaScript的区别

ECMAScript是由欧洲计算机制造商协会(ECMA)制定的一个标准化脚本语言规范。最初由Netscape公司在1996年开发的JavaScript成为了最早的实现之一。为了避免商标冲突,Netscape将JavaScript提交给了ECMA,以标准化它的定义和行为,最终形成了ECMAScript。语法规则:规定了如何编写代码。类型:描述了不同的数据类型,如字符串、数字、布尔值等。对象模型:定义了如何创建和操作对象。控制结构:提供了条件语句、循环等控制代码执行的方式。

weidl001的博客 1475

ecmascript和javascript的区别

ECMAScript是一种由 ECMA 国际组织制定的脚本语言标准。ECMAScript 定义了语言的语法、类型、对象和功能等核心特性。它不是一种具体的编程语言,而是一个规范。JavaScript是基于 ECMAScript 标准的编程语言。尽管 JavaScript 遵循 ECMAScript 的规范,但它还包括一些额外的功能和特性,特别是与浏览器环境和 DOM 操作相关的功能。

W楠的博客 1487

ecmascript标准

ECMAScript标准是一种被标准化的脚本语言规范,最初由Netscape公司提交至欧洲计算机制造商协会(ECMA International),并最终形成了国际标准ECMA-262。该标准定义了JavaScript的核心特性和语法,并随着版本的迭代不断更新和完善。ECMAScript标准每年都会进行一次更新,以增强其功能并跟上不断发展的Web开发需求。例如,ECMAScript 2024标准于2024年6月26日通过,成为最新的ECMAScript标准。

破损的天堂鸟博客 1062

ECMAScript和JavaScript的区别

ECMAScript是一种由ECMA国际(前身为欧洲计算机制造商协会)制定的脚本语言规范。它不是一种具体的编程语言,而是一种标准化的脚本语言描述,旨在定义脚本语言的通用核心特性和行为。历史背景:ECMAScript起源于Netscape公司推出的LiveScript脚本语言,后来为了与当时广泛知名的Java语言挂钩,更名为JavaScript。

蜡笔小新星的博客 1404

ECMAScript详解

定义:ECMAScript是JavaScript、JScript和ActionScript等脚本语言的基础标准。起源:最初由网景的布兰登·艾奇开发,命名为Mocha,后改名为LiveScript,最终确定为JavaScript。1996年,网景公司将JavaScript提交给Ecma国际进行标准化,ECMA-262的第一个版本于1997年6月被采纳。ECMAScript作为一种广泛应用的脚本语言标准,具有轻量级、面向对象、支持异步编程和丰富的API等特点。

AOMGyz的博客 716
上一篇: 速看!盘点这一年 OpenTiny 都在做什么?
下一篇: 速速报名,30万奖金不容错过!OpenTiny 挑战赛开发指南来咯~
OpenTiny社区
博客等级 码龄4年 1540粉丝 266原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值