最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中新數(shù)組分組方法詳解

 更新時間:2024年02月22日 08:39:58   作者:chuckQu  
對數(shù)組中的項目進行分組,你可能已經(jīng)做過很多次了,好消息是,JavaScript?現(xiàn)在有了分組方法,所以你再也不必這樣做了,下面我們就來看看它們的具體使用吧

對數(shù)組中的項目進行分組,你可能已經(jīng)做過很多次了。每次都會手動編寫一個分組函數(shù),或者使用 lodash 的 groupBy 函數(shù)。

好消息是,JavaScript 現(xiàn)在有了分組方法,所以你再也不必這樣做了。Object.groupBy 和 Map.groupBy 這兩個新方法將使分組變得更簡單,并節(jié)省我們的時間或依賴性。

以前的做法

假設(shè)你有一個代表人的對象數(shù)組,你想按年齡對它們進行分組。你可以這樣使用 forEach 循環(huán):

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;
}, {});

無論哪種方法,代碼都略顯笨拙。你總是要檢查對象是否存在分組鍵,如果不存在,就用一個空數(shù)組來創(chuàng)建它。然后再將項目推入數(shù)組。

使用Object.groupBy

有了新的 Object.groupBy 方法,你就可以像這樣得出結(jié)果:

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

簡單多了!不過也有一些需要注意的地方。

Object.groupBy 返回一個空原型對象。這意味著該對象不繼承 Object.prototype 的任何屬性。這很好,因為這意味著你不會意外覆蓋 Object.prototype 上的任何屬性,但這也意味著該對象沒有你可能期望的任何方法,如 hasOwnProperty 或 toString。

const peopleByAge = Object.groupBy(people, (person) => person.age);
console.log(peopleByAge.hasOwnProperty("28"));
// TypeError: peopleByAge.hasOwnProperty is not a function

傳遞給 Object.groupBy 的回調(diào)函數(shù)應(yīng)返回字符串或Symbol。如果返回其他內(nèi)容,則將強制轉(zhuǎn)為字符串。

在我們的示例中,我們一直以數(shù)字形式返回age,但在結(jié)果中卻被強制轉(zhuǎn)為字符串。盡管如此,你仍然可以使用數(shù)字訪問屬性,因為使用方括號符號也會將參數(shù)強制為字符串。

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 之外,Map.groupBy 的功能與 Object.groupBy 幾乎相同。這意味著你可以使用所有常用的 Map 函數(shù)。這也意味著你可以從回調(diào)函數(shù)返回任何類型的值。

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 中按對象檢索項目,對象必須具有相同的引用。

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 中返回任何內(nèi)容。要想成功地從 Map 中獲取項目,請確保你保留了要用作鍵的對象的引用。

何時可用

這兩個 groupBy 方法是 TC39 提議的一部分,目前處于第三階段。這意味著它很有可能成為一項標(biāo)準(zhǔn),因此也出現(xiàn)了一些實施方案。

Chrome 瀏覽器 117 版本剛剛推出了對這兩種方法的支持,而 Firefox 瀏覽器 119 版本也發(fā)布了對這兩種方法的支持。Safari 以不同的名稱實現(xiàn)了這些方法,我相信他們很快就會更新。既然 Chrome 瀏覽器中出現(xiàn)了這些方法,就意味著它們已在 V8 中實現(xiàn),因此下次 V8 更新時,Node 中也會出現(xiàn)這些方法。

為什么使用靜態(tài)方法

你可能會問,為什么要以 Object.groupBy 而不是 Array.prototype.groupBy 的形式來實現(xiàn)呢?根據(jù)該提案,有一個庫曾經(jīng)用一個不兼容的 groupBy 方法對 Array.prototype 進行了猴子補丁。在考慮新的應(yīng)用程序接口時,向后兼容性非常重要。幾年前,在嘗試實現(xiàn) Array.prototype.flatten 時,這一點在一次被稱為 SmooshGate 的事件中得到了強調(diào)。

幸運的是,使用靜態(tài)方法似乎更有利于未來的可擴展性。當(dāng) Record 和 Tuples 提議實現(xiàn)時,我們可以添加一個 Record.groupBy 方法,用于將數(shù)組分組為不可變的記錄。

總結(jié)

將項目分組顯然是我們開發(fā)人員的一項重要工作。目前,每周從 npm 下載 lodash.groupBy 的次數(shù)在 150 萬到 200 萬之間。很高興看到 JavaScript 填補了這些空白,讓我們的工作變得更加輕松。

現(xiàn)在,下載 Chrome 117 并親自嘗試這些新方法吧。

到此這篇關(guān)于JavaScript中新數(shù)組分組方法詳解的文章就介紹到這了,更多相關(guān)JavaScript數(shù)組分組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript實現(xiàn)表單隔行變色

    javascript實現(xiàn)表單隔行變色

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)表單隔行變色,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JavaScript指定斷點操作實例教程

    JavaScript指定斷點操作實例教程

    這篇文章主要給大家介紹了關(guān)于JavaScript指定斷點操作的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 微信小程序van-field中的left-icon屬性自定義實現(xiàn)過程

    微信小程序van-field中的left-icon屬性自定義實現(xiàn)過程

    在小程序中,我們是用 Vant 組件庫時,常常會用到 van-field 輸入框控件,今天我將跟大家分享的是 van-field 輸入框控件中的 left-icon 屬性的自定義怎么實現(xiàn),感興趣的朋友一起看看吧
    2023-08-08
  • Javascript中字符串相關(guān)常用的使用方法總結(jié)

    Javascript中字符串相關(guān)常用的使用方法總結(jié)

    本篇文章主要介紹了Javascript中字符串相關(guān)常用的使用方法。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 關(guān)于Javascript中document.cookie的使用

    關(guān)于Javascript中document.cookie的使用

    這篇文章主要介紹了關(guān)于Javascript中document.cookie的使用,通過cookie來記住密碼保存密碼功能,需要的朋友可以參考下
    2017-03-03
  • Math.js解決js中小數(shù)精度丟失問題

    Math.js解決js中小數(shù)精度丟失問題

    在JavaScript中進行小數(shù)運算時,會容易出現(xiàn)精度丟失的問題,例如在進行兩個小數(shù)相加時,結(jié)果并不是預(yù)期的精確值,而是一個近似值,,使用第三方庫Math.js可以避免精度丟失的問題,本文導(dǎo)入Math.js庫和使用Math.js的方法來進行小數(shù)運算,同時還可以指定格式來保留小數(shù)位數(shù)
    2023-12-12
  • 淺談javascript獲取元素transform參數(shù)

    淺談javascript獲取元素transform參數(shù)

    本文主要給大家簡單介紹了javascript獲取元素的transform參數(shù)的方法以及個人的理解,記錄下來分享給大家。
    2015-07-07
  • JavaScript實現(xiàn)左右滾動電影畫布

    JavaScript實現(xiàn)左右滾動電影畫布

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)左右滾動電影畫布,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • JavaScript樹結(jié)構(gòu)深度優(yōu)先算法

    JavaScript樹結(jié)構(gòu)深度優(yōu)先算法

    這篇文章主要介紹了JavaScript樹結(jié)構(gòu)深度優(yōu)先算法,樹結(jié)構(gòu)可以說是前端中最常見的數(shù)據(jù)結(jié)構(gòu)之一,比如說DOM樹、級聯(lián)選擇、樹形組件,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-07-07
  • JavaScript ES6 Class類實現(xiàn)原理詳解

    JavaScript ES6 Class類實現(xiàn)原理詳解

    這篇文章主要介紹了JavaScript ES6 Class類實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05

最新評論

汉中市| 志丹县| 阳新县| 孝义市| 海盐县| 普兰店市| 文安县| 鹤山市| 含山县| 西昌市| 辽中县| 浮梁县| 广河县| 蕉岭县| 枝江市| 通道| 穆棱市| 淳化县| 双江| 临漳县| 镇坪县| 郎溪县| 武义县| 泸溪县| 五河县| 洪泽县| 利津县| 隆化县| 峨边| 南充市| 郯城县| 伽师县| 额敏县| 昌都县| 洛宁县| 广安市| 老河口市| 永康市| 秀山| 安徽省| 邹平县|