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

这篇具有很好参考价值的文章主要介绍了JavaScript 终于原生支持数组分组了!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

以前的数组分组

假设有一个由表示人员的对象组成的数组,需要按照年龄进行分组。可以使用forEach循环来实现,代码如下:

const people = [

  { name: "Alice", age: 28 },

  { name: "Bob", age: 30 },

  { name: "Eve", age: 28 },

];



const peopleByAge = {};



people.forEach((person) => {

  const age = person.age;

  if (!peopleByAge[age]) {

    peopleByAge[age] = [];

  }

  peopleByAge[age].push(person);

});



console.log(peopleByAge);

输出结果如下:

{

  "28": [{"name":"Alice","age":28}, {"name":"Eve","age":28}],

  "30": [{"name":"Bob","age":30}]

}

也可以使用reduce方法:

const peopleByAge = people.reduce((acc, person) => {

  const age = person.age;

  if (!acc[age]) {

    acc[age] = [];

  }

  acc[age].push(person);

  return acc;

}, {});

无论哪种方式,代码都略显繁琐。每次都要检查对象,看分组键是否存在,如果不存在,则创建一个空数组,并将项目添加到该数组中。

使用 Object.groupBy 分组

可以通过以下方式来使用新的Object.groupBy方法:

const peopleByAge = Object.groupBy(people, (person) => person.age);

可以看到,代码非常简洁!

不过需要注意,使用Object.groupBy方法返回一个没有原型(即没有继承任何属性和方法)的对象。这意味着该对象不会继承Object.prototype上的任何属性或方法,例如hasOwnPropertytoString等。虽然这样做可以避免意外覆盖Object.prototype上的属性,但也意味着不能使用一些与对象相关的方法。

const peopleByAge = Object.groupBy(people, (person) => person.age);

console.log(peopleByAge.hasOwnProperty("28"));

// TypeError: peopleByAge.hasOwnProperty is not a function

在调用Object.groupBy时,传递给它的回调函数应该返回一个字符串或 Symbol 类型的值。如果回调函数返回其他类型的值,它将被强制转换为字符串。

在这个例子中,回调函数返回的是一个数字类型的age属性值,但由于Object.groupBy方法要求键必须是字符串或 Symbol 类型,所以该数字会被强制转换为字符串类型。

console.log(peopleByAge[28]);

// => [{"name":"Alice","age":28}, {"name":"Eve","age":28}]

console.log(peopleByAge["28"]);

// => [{"name":"Alice","age":28}, {"name":"Eve","age":28}]

使用 Map.groupBy 分组

Map.groupByObject.groupBy几乎做的是相同的事情,只是返回的结果类型不同。Map.groupBy返回一个Map对象,而不是像Object.groupBy返回一个普通的对象。、

const ceo = { name: "Jamie", age: 40, reportsTo: null };

const manager = { name: "Alice", age: 28, reportsTo: ceo };



const people = [

  ceo

  manager,

  { name: "Bob", age: 30, reportsTo: manager },

  { name: "Eve", age: 28, reportsTo: ceo },

];



const peopleByManager = Map.groupBy(people, (person) => person.reportsTo);

这里根据人的汇报上级将他们进行了分组。如果想通过对象来从这个Map中获取数据,那么要求这些对象具有相同的身份或引用。这是因为Map在比较键时使用的是严格相等(===),只有两个对象具有相同的引用,才能被认为是相同的键。

peopleByManager.get(ceo);

// => [{ name: "Alice", age: 28, reportsTo: ceo }, { name: "Eve", age: 28, reportsTo: ceo }]

peopleByManager.get({ name: "Jamie", age: 40, reportsTo: null });

// => undefined

在上面的例子中,如果尝试使用与ceo对象类似的对象作为键去访问Map中的项,由于这个对象与之前存储在Map中的ceo对象不是同一个对象,所以无法检索到对应的值。

浏览器支持

这两个groupBy方法是 proposal-array-grouping 提案提出的,该提案目前处于第3阶段,预计会在 2024 年成为正式标准。

9 月 12 日,Chrome 117发布,该版本支持了这两个方法。Firefox Nightly 在一个标志后已经实现了这两个方法。Safari已经以不同的名称实现了这些方法。由于这些方法在 Chrome 中可用,这意味着它们已经在V8中被实现,所以下一次V8更新时它们将在Node中可用。

为什么要使用静态方法?

你可能会想,为什么这个功能被实现为Object.groupBy而不是Array.prototype.groupBy。根据提案,有一个库曾经用不兼容的groupBy方法对Array.prototype进行了修改。在考虑为Web新增API时,向后兼容性非常重要。几年前,在尝试实现Array.prototype.flatten时就出现了一个称为SmooshGate的事件。

使用静态方法实际上对未来的可扩展性更好。当RecordsTuples提案实现时,可以添加一个Record.groupBy方法,用于将数组分组为不可变记录。

简而言之,使用静态方法可以更好地保持向后兼容性,并提供更好的扩展性,以便在未来添加更多功能和数据结构。

JavaScript 正在填补这些空白,并使我们的开发更简单。目前,lodash.groupBy每周的 npm 下载量在 150 万至 200 万次之间,当所有浏览器都支持该方法之后,就不再需要引入lodash.groupBy 库了!

JavaScript 终于原生支持数组分组了!文章来源地址https://www.toymoban.com/news/detail-710029.html

到了这里,关于JavaScript 终于原生支持数组分组了!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端本地原生开发好用的 http server 服务(npm 包形式、支持热更新、简单好用)

    有时候在本地原生网页开发的时候,需要起一个服务能够直接访问当现在正在开发 index.html 等内容,也就是希望通过 npm 包在进入项目文件夹后,直接可以起一个 可访问的 http 链接 ,不希望在去安装 nginx 。 下面例举几个: serve:为本地静态页面创建一个可访问的服务,不支

    2024年02月04日
    浏览(58)
  • 虽迟但到,Postman终于支持Websocket接口了

    01 WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数

    2024年02月05日
    浏览(35)
  • 云原生 envoy xDS 动态配置 java控制平面开发 支持restful grpc实现 EDS 动态endpoint配置

    大纲 基础概念 Envoy 动态配置API 配置方式 动静结合的配置方式 纯动态配置方式 实战 Envoy 的强大功能之一是支持动态配置,当使用动态配置时,我们不需要重新启动 Envoy 进程就可以生效。 Envoy 通过从磁盘文件或网络接口 读取配置,动态地重新加载配置。动态配置使用所谓的

    2024年02月12日
    浏览(34)
  • 期待已久:K8S终于迎来交换内存Beta支持!

    关注 【云原生百宝箱】 公众号,获取更多云原生消息 Kubernetes 1.22 版本开始支持在 Linux 节点上使用交换内存的 Alpha 特性,而在 1.28 版本中升级为 Beta 版本并进行了许多改进。之前版本的 Kubernetes 不支持 Linux 系统上的交换内存,但随着 Alpha 版本和后续的改进,Kubernetes 项目团

    2024年02月05日
    浏览(40)
  • 【打工日常】云原生之使用Docker部署开源云笔记工具Leanote

    1.Leanote简介 Leanote 蚂蚁笔记是一款国产开源的私有云笔记工具。它支持普通格式笔记、Markdown语法、专业数学公式编辑、和思维导图,并且支持vimemacs等编辑模式。 2.Leanote功能 拥有Markdown 语法支持、无干扰写作模式、Vim和Emacs编辑模式、将笔记导出为 PDF、可批注操作,具备可

    2024年04月28日
    浏览(39)
  • Go1.21 速览:Go 终于打算进一步支持 WebAssembly 了。。。

    大家好,我是煎鱼。 之前写过一篇关于 Go WebAssembly 的相关文章 《一分钟搞明白!快速掌握 Go WebAssembly》,今天带来一则新消息。 想着 Go 过去了那么多年了,只在 Go1.11 支持了 WebAssembly1.0 的部分功能(js/syscall),还没有完整的支持 WebAssembly System Interface(WASI)。这可真的是

    2024年02月05日
    浏览(34)
  • python日常记账本源代码,基于PySide6,支持快速查询、绘制图表

    python日常记账本源代码,基于PySide6(Qt for Python 6)的账本,界面简洁、功能强大,支持保存文件、快速查询、绘制图表等,是平时记账的不错选择。账目查询、账本编辑、添加/删除、撤销/重做、统计数据、生成图表。 运行截图: 完整程序下载地址:python日常记账本源代码

    2024年02月11日
    浏览(74)
  • mysql 分组查询后,将某个字段转成数组

    在 MySQL 中将分组查询后的某一个字段转成数组,可以使用 GROUP_CONCAT 函数。 GROUP_CONCAT 函数用于将某个字段的值连接起来,如果加上 DISTINCT ,则会去除重复的值。我们可以利用这个函数来实现将某个字段的值转成数组的功能。 示例 SQL 语句: 以上 SQL 语句将 products 表按

    2024年02月14日
    浏览(50)
  • JavaScript、微信小程序 根据汉字拼音首字母进行归类分组

    在微信小程序里面不支持这个localeCompare方法,所以有了下面的方法 我们需要一个 开源的汉字库 ,也就是码表。这个库就可以。git库 不想去git下载直接拉到最底下有js文件,直接复制就行。 然后页面引入 china.js代码

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包