成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript 終于原生支持數組分組了!

開發 前端
在日常開發中,很多時候需要對數組進行分組,每次都要手寫一個分組函數,或者使用lodash的groupBy函數。好消息是,JavaScript 現在正在引入全新的分組方法:Object.groupBy和Map.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上的任何屬性或方法,例如hasOwnProperty或toString等。雖然這樣做可以避免意外覆蓋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.groupBy和Object.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的事件。

使用靜態方法實際上對未來的可擴展性更好。當Records和Tuples提案實現時,可以添加一個Record.groupBy方法,用于將數組分組為不可變記錄。

簡而言之,使用靜態方法可以更好地保持向后兼容性,并提供更好的擴展性,以便在未來添加更多功能和數據結構。

JavaScript 正在填補這些空白,并使我們的開發更簡單。目前,lodash.groupBy每周的 npm 下載量在 150 萬至 200 萬次之間,當所有瀏覽器都支持該方法之后,就不再需要引入lodash.groupBy 庫了!

責任編輯:姜華 來源: 前端充電寶
相關推薦

2023-11-03 07:21:40

Javascript數組分組

2023-08-29 09:43:21

Node.js.env

2015-12-15 10:32:44

chromecss開發

2020-03-02 15:17:37

云原生CNCF容器

2016-12-21 09:35:55

JavaScript原生數組函數

2014-01-22 09:46:42

JavaScript數組

2020-05-08 08:01:11

多線程Redis處理

2022-07-04 09:21:16

GNOME Web瀏覽器

2023-07-24 09:11:43

CSS滾動驅動動畫

2024-01-08 09:28:20

2023-05-29 08:38:56

popover控制懸浮層

2025-01-20 00:00:00

Java語言Record

2023-02-13 09:31:07

CSS前端

2023-04-10 09:18:42

CSS前端

2023-11-23 11:37:13

JavaScript數組

2023-10-31 07:40:15

EslintJSHint

2024-07-08 00:00:07

2020-02-23 16:33:02

GitHub印度子公司

2021-07-29 20:29:36

Linux c 代碼Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线观看av | 国产精品久久 | 日韩欧美在 | 久久精品69 | 性色视频| 日韩在线观看网站 | 男女羞羞网站 | 欧美成人h版在线观看 | 免费av手机在线观看 | 一级毛片视频 | 成人午夜看片 | 色天堂影院 | 精品美女| 99亚洲精品| 亚洲导航深夜福利涩涩屋 | 欧美一级毛片久久99精品蜜桃 | 男人天堂av网 | 龙珠z在线观看 | 成人av一区二区三区 | 国产精品久久免费观看 | 日本亚洲精品成人欧美一区 | 成人av观看 | 久久久噜噜噜久久中文字幕色伊伊 | 日韩中文字幕在线观看 | 久久久久久久久久爱 | 日韩中文字幕一区二区三区 | 国产一区二区精品在线 | 一区二区三区久久久 | 欧美黑人国产人伦爽爽爽 | 国产区在线免费观看 | 欧美理伦片在线播放 | 午夜影院在线观看 | 久久国产精品一区二区三区 | 午夜精品久久久久久久久久久久 | 一区二区视频在线 | 国产成人综合久久 | 91精品国产综合久久福利软件 | 国产精品中文字幕在线 | 伊人av在线播放 | 精品三区| 亚洲国产伊人 |