自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Javascript支持?jǐn)?shù)組分組(groupBy)的方法即將到來!

開發(fā) 前端
本文介紹了JavaScript?中即將引入的Object.groupBy和Map.groupBy?兩種原生分組方法的使用。這些兩種原生分組方法將填補(bǔ)JavaScript開發(fā)中的空白,使前端開發(fā)人員能夠更輕松地進(jìn)行分組操作,提高了編程效率和代碼質(zhì)量。希望本文能對你以后的工作有所幫助。

前言

在JavaScript編程中,對數(shù)組進(jìn)行分組是一項常見的任務(wù)。無論是根據(jù)特定屬性將對象分組,還是按照某些規(guī)則重新組織數(shù)組元素,分組操作在日常開發(fā)中都是常見的。過去,為了實現(xiàn)這一目標(biāo),通常需要編寫自定義的分組函數(shù)或者使用第三方庫,比如lodash的groupBy函數(shù)。然而,好消息是,JavaScript正逐漸引入原生的分組方法,使我們的開發(fā)工作更加便捷。在本文中,我們將探討JavaScript的新特性,即Object.groupBy和Map.groupBy,這兩個新特性將使數(shù)組分組操作更加容易。

1、分組操作的背景

假設(shè)現(xiàn)在有一個包含人員信息的數(shù)組,每個人都有姓名和年齡屬性,需求想要按照他們的年齡將他們分組。在以前的JavaScript中,可能需要編寫自定義的分組函數(shù),或者使用forEach或reduce等方法,來實現(xiàn)分組操作。如下:

const people = [
  { name: "Alice", age: 28 },
  { name: "Bob", age: 30 },
  { name: "Eve", age: 28 },
];


// 使用forEach進(jìn)行分組
const peopleByAge = {};


people.forEach((person) => {
  const age = person.age;
  if (!peopleByAge[age]) {
    peopleByAge[age] = [];
  }
  peopleByAge[age].push(person);
});


// 使用reduce進(jìn)行分組
const peopleByAge = people.reduce((acc, person) => {
  const age = person.age;
  if (!acc[age]) {
    acc[age] = [];
  }
  acc[age].push(person);
  return acc;
}, {});

運(yùn)行結(jié)果:

圖片圖片

無論是使用forEach還是reduce,這些傳統(tǒng)方法都需要手動檢查分組鍵是否存在,如果不存在則創(chuàng)建一個空數(shù)組,然后將對象推入該數(shù)組中。上面的示例代碼相對繁瑣,可能需要不少工作量,尤其是在復(fù)雜的應(yīng)用程序中。

下面就來Javascript即將支持的兩種新特性是如何實現(xiàn)上述需求的→

2、Object.groupBy:原生分組方法

JavaScript新引入的Object.groupBy方法,使數(shù)據(jù)分組將變得更加簡單和高效。使用Object.groupBy,可以按照指定的屬性或規(guī)則將數(shù)組中的對象分組,而不需要手動管理分組過程。如下:

const people = [
  { name: "Alice", age: 28 },
  { name: "Bob", age: 30 },
  { name: "Eve", age: 28 },
];


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

在控制臺運(yùn)行代碼可以看到:

圖片圖片

如上圖所示,使用Object.groupBy,只需提供一個回調(diào)函數(shù),該回調(diào)函數(shù)將確定如何進(jìn)行分組。在這種情況下,就可以按照人的年齡屬性進(jìn)行分組,這是不是比傳統(tǒng)的手動分組方法要簡單得多。

然而,需要注意的是,Object.groupBy返回一個無原型的對象,這意味著它不會繼承Object.prototype上的任何屬性或方法。因此,不能像通常那樣使用hasOwnProperty等方法。此外,回調(diào)函數(shù)應(yīng)返回一個字符串或符號,否則它將被強(qiáng)制轉(zhuǎn)換為字符串。

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

圖片圖片

3、Map.groupBy:返回Map對象的分組方法

除了Object.groupBy,JavaScript還引入了Map.groupBy方法,該方法在執(zhí)行分組操作時返回一個Map對象。與Object.groupBy相比,Map.groupBy提供了更多的靈活性,因為它允許返回任何類型的值,并且可以使用Map的各種方法來操作結(jié)果。如下:

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);

運(yùn)行結(jié)果:

圖片圖片

在這個示例中,我們根據(jù)人員的上級進(jìn)行分組。一個重要的注意點是,要從Map中檢索對象,必須使用相同的對象引用。如果傳遞的對象雖然內(nèi)容相同但不是同一個對象,將無法從Map中檢索到結(jié)果。

peopleByManager.get(ceo); 
// 返回與ceo對象相關(guān)的人員
peopleByManager.get({ name: "Jamie", age: 40, reportsTo: null }); 
// 返回undefined,因為這不是同一個對象

圖片圖片

Map.groupBy的優(yōu)勢在于,它返回一個Map對象,可以使用Map的方法來處理分組后的結(jié)果,這在某些場景下非常有用。

4、分組方法的兼容性

目前Object.groupBy和Map.groupBy是TC39提案的一部分,目前處于第3階段。這表明它們有望成為JavaScript標(biāo)準(zhǔn)的一部分。在實際應(yīng)用中,Chrome 117已經(jīng)支持這兩個方法,而Firefox Nightly則在實驗標(biāo)志下實現(xiàn)了它們。Safari也已經(jīng)實現(xiàn)了類似的方法,可以期待它們會在不久的將來更新以提供更好的支持。

上面示例代碼運(yùn)行的瀏覽器版本是118.0.5993.89,故可以正確的打印出結(jié)果。

圖片圖片

5、疑問

你可能會疑惑為什么這些分組方法被實現(xiàn)為Object.groupBy和Map.groupBy,而不是Array.prototype.groupBy。這是因為在過去,有一些庫曾經(jīng)在Array.prototype上添加了不兼容的groupBy方法,這導(dǎo)致了一些兼容性問題,所以就沒有在Array.prototype上實現(xiàn)。

總結(jié)

本文介紹了JavaScript中即將引入的Object.groupBy和Map.groupBy兩種原生分組方法的使用。這些兩種原生分組方法將填補(bǔ)JavaScript開發(fā)中的空白,使前端開發(fā)人員能夠更輕松地進(jìn)行分組操作,提高了編程效率和代碼質(zhì)量。希望本文能對你以后的工作有所幫助。

本文轉(zhuǎn)載自微信公眾號「黑土豆的前端博客 」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系公眾號。

責(zé)任編輯:武曉燕 來源: 黑土豆的前端博客
相關(guān)推薦

2018-08-15 09:12:58

2023-09-21 10:09:10

JavaScript數(shù)組分組

2022-09-11 08:10:44

Fedora

2010-10-25 13:12:13

云計算

2015-07-03 09:45:34

火車WiFi

2021-12-14 10:04:52

無密碼時代多因素身份驗證MFA

2022-10-12 00:07:25

加密貨幣區(qū)塊鏈比特幣

2009-05-05 10:36:44

KDESocialDesktop

2015-02-09 15:37:46

2023-11-10 09:04:47

2010-04-19 15:58:33

互聯(lián)網(wǎng)

2015-06-16 10:50:45

2013-03-11 09:43:30

VMware vClo公有云服務(wù)

2013-10-09 10:50:00

智能電視智能電視庫應(yīng)用

2013-01-25 09:43:14

2015-04-29 09:55:50

Windows 10

2023-02-14 09:37:00

Vue無虛擬模式

2015-05-05 11:35:04

云計算大數(shù)據(jù)BDaas

2021-09-04 05:00:26

ESES2021ES12

2010-09-27 11:10:14

云計算
點贊
收藏

51CTO技術(shù)棧公眾號