首页 > 编程语言 >JavaScript – Group / GroupToMap

JavaScript – Group / GroupToMap

时间:2023-01-26 21:56:55浏览次数:64  
标签:group name age JavaScript groupToMap item GroupToMap key Group

前言

array group by 是一个很常见的功能. 但 JS 却没有 build-in 方法. 一直到 es2023 才有 group 和 groupToMap (目前没有任何游览器支持, 但已经有 polyfill 了).

这篇来聊一聊这个.

 

参考

ECMAScript 2023将新增的九个数组方法

Stack Overflow – Most efficient method to groupby on an array of objects (用 reduce 实现的 group by, 也是最 popular 的方案)

 

Setup

目前游览器不支持, 要 test 需要安装 core.js

yarn add core-js

然后 import, 然后 declare TypeScript

import 'core-js/actual/array/group';
import 'core-js/actual/array/group-to-map';

declare global {
  interface Array<T> {
    group<GroupKey extends string | symbol>(
      callbackfn: (this: T[], item: T, index: number, array: T[]) => GroupKey
    ): Record<GroupKey, T[]>;

    groupToMap<GroupKey>(
      callbackfn: (this: T[], item: T, index: number, array: T[]) => GroupKey
    ): Map<GroupKey, T[]>;
  }
}

 

Array.group

group<GroupKey extends string | symbol>(
  callbackfn: (this: T[], item: T, index: number, array: T[]) => GroupKey
): Record<GroupKey, T[]>;

group 的用法很简单, 给一个 callbackfn, 返回一个 key. 它会把相同 key 的 item group 在一起.

最终返回一个对象, 对象的 key 就是 group by 的 key, value 则是相同 key 的所有 items.

例子: group by name

const items = [
  { name: 'Derrick', age: 1 },
  { name: 'Peter', age: 1 },
  { name: 'Derrick', age: 2 },
  { name: 'Peter', age: 2 },
];
const result = items.group(item => item.name);
console.log(JSON.stringify(result, null, 2));

结果

注意: key 只能是 string or symbol. 其它的都不可以, 包括 number, 如果 callbackfn 返回不是 string | symbol 会被强转成 string.

 

Array.groupToMap

groupToMap<GroupKey>(
  callbackfn: (this: T[], item: T, index: number, array: T[]) => GroupKey
): Map<GroupKey, T[]>;

它和 group 差不多. 只是 group key 不强制是 string | symbol. 可以返回任何类型.

因为 groupToMap 返回的结果不是 object, 而是 Map. 而我们知道 Map 的 key 可以是任何类型.

const items = [
  { name: 'Derrick', age: 1 },
  { name: 'Peter', age: 1 },
  { name: 'Derrick', age: 2 },
  { name: 'Peter', age: 2 },
];
const result = items.groupToMap(item => item.name);
for (const [key, value] of result) {
  // 1. ['Derrick', [{ name: 'Derrick', age: 1 }, { name: 'Derrick', age: 2 }]]
  // 2. ['Peter', [{ name: 'Peter', age: 1 }, { name: 'Peter', age: 2 }]]
  console.log([key, value]);
}

 

How it compare?

group by 的关键之一就是 group key 的 comparison. 

比如我 fetch 获取一些资料, 然后想 group by Date.

这时候如果用 group 的话, 它会先把 Date 转成 string 然后通过 === 来 compare.

如果是 groupToMap 则是直接用 === 来 compare. 这时就危险了. 因为 Date 是对象 === 比的是指针是否相同, 而不是 date time value 是否相同.

所以在使用 group 或 groupToMap 要注意 group key 的类型哦.

 

multiple group key

C# LINQ GroupBy 支持 multiple group key

items.GroupBy(item => new { item.Name, item.Age }).ToList()

但 JS 没有这个功能. 而且也没有简单的手法可以利用 group | groupToMap 去实现这个功能.

 

标签:group,name,age,JavaScript,groupToMap,item,GroupToMap,key,Group
From: https://www.cnblogs.com/keatkeat/p/17068291.html

相关文章

  • JavaScript学习笔记—包装类
    1.描述字符串本质就是一个字符数组"hello"-->["h","e","l","l","o"]2.属性和方法(1)length获取字符串的长度(2)字符串[index]获取指定位置的字符(3)at(index)......
  • JavaScript学习笔记—Date
    在JS中所有的和时间相关的数据都由Date对象来表示对象的方法(1)getFullYear()返回当前日期的年份(4位)(2)getMonth()返回当前日期的月份(0-11)(3)getDate()返回当前日期的几......
  • JavaScript学习笔记—Math
    工具类为我们提供了数学运算相关的一些常量和方法常量(1)Math.PI圆周率方法(1)Math.abs()求一个数的绝对值(2)Math.min()求多个值中的最小值(3)Math.max()求多个值中的......
  • JavaScript:判断数组对象值是否相同的函数声明
    varobj1={name:"w",};varobj2={name:"w",};functionisObjectValueEqual(a,b){//判断两个对......
  • Day02 - JavaScripts
    1.javascript介绍JavaScript的定义JavaScript是运行在浏览器端的脚步语言,是由浏览器解释执行的,简称js,它能够让网页和用户有交互功能,增加良好的用户体验效果。......
  • JavaScript学习笔记—Map
    Map用来存储键值对结构的数据(key-value)Map中任何类型的值都可以成为数据的key1.创建:newMap()2.属性和方法:(1)map.size()获取map中键值对的数量(2)map.set(key,val......
  • JavaScript学习笔记—使用JSON进行深复制
    constobj={name:"孙悟空",friend:{name:"猪八戒"}};//对obj进行浅复制constobj2=Object.assign({},obj);//对obj进行深复制constobj3=s......
  • JavaScript 类型转换
    JavaScript中有两种类型转换:隐式类型转换和显式类型转换。隐式类型转换指JavaScript在运行时自动将一种类型转换为另一种类型。例如,在数学运算中,JavaScript会将字符串......
  • JavaScript学习笔记—对象的序列化
    JS中的对象使用时都是存在于计算机的内存中序列化指将对象转换为一个可以存储的格式,在JS中对象的序列化通常是将一个对象转换为字符串(JSON字符串)序列化的用途,对象转换为......
  • 说一说JavaScript有几种方法判断变量的类型?
    typeof、instanceof、Object.prototype.toString.call()(对象原型链判断方法)、constructor(用于引用数据类型)标准回答JavaScript有4种方法判断变量的类型......