Map.groupBy()
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с марта 2024 года.
Примечание: В некоторых версиях некоторых браузеров этот метод был реализован как метод Array.prototype.groupToMap(). Из-за проблем с веб-совместимостью теперь он реализован как статический метод. Проверьте таблицу совместимости браузеров для получения подробной информации.
Статический метод Map.groupBy() группирует элементы заданного итерируемого объекта, используя значения, возвращаемые предоставленной функцией обратного вызова. Итоговый возвращаемый Map использует уникальные значения из тестовой функции в качестве ключей, которые могут быть использованы для получения массива элементов в каждой группе.
Метод в первую очередь полезен при группировке элементов, связанных с объектом, и в частности, когда этот объект может меняться со временем. Если объект инвариантен, вы можете вместо этого представить его в виде строки и группировать элементы с помощью Object.groupBy().
Попробуйте
const inventory = [
{ name: "asparagus", type: "vegetables", quantity: 9 },
{ name: "bananas", type: "fruit", quantity: 5 },
{ name: "goat", type: "meat", quantity: 23 },
{ name: "cherries", type: "fruit", quantity: 12 },
{ name: "fish", type: "meat", quantity: 22 },
];
const restock = { restock: true };
const sufficient = { restock: false };
const result = Map.groupBy(inventory, ({ quantity }) =>
quantity < 6 ? restock : sufficient,
);
console.log(result.get(restock));
// [{ name: "bananas", type: "fruit", quantity: 5 }]
Синтаксис
Map.groupBy(items, callbackFn)
Параметры
-
items - Итерируемый объект (iterable) (такой как
Array), элементы которого будут сгруппированы. -
callbackFn - Функция, выполняемая для каждого элемента в итерируемом объекте. Она должна возвращать значение (объект или примитив), указывающее на группу текущего элемента. Функция вызывается со следующими аргументами:
-
element - Текущий обрабатываемый элемент.
-
index - Индекс текущего обрабатываемого элемента.
-
Возвращаемое значение
Объект Map с ключами для каждой группы, каждый из которых связан с массивом, содержащим элементы соответствующей группы.
Описание
Map.groupBy() вызывает предоставленную функцию callbackFn один раз для каждого элемента в итерируемом объекте. Функция обратного вызова должна возвращать значение, указывающее на группу связанного элемента. Значения, возвращаемые callbackFn, используются в качестве ключей для Map, возвращаемого Map.groupBy(). Каждый ключ имеет связанный массив, содержащий все элементы, для которых обратный вызов вернул одно и то же значение.
Элементы в возвращаемом Map и исходном итерируемом объекте совпадают (это не глубокие копии). Изменение внутренней структуры элементов будет отражено как в исходном итерируемом объекте, так и в возвращаемом Map.
Этот метод полезен, когда вам нужно сгруппировать информацию, связанную с конкретным объектом, который потенциально может меняться со временем. Это потому, что даже если объект изменен, он будет продолжать работать в качестве ключа к возвращаемому Map. Если вместо этого вы создадите строковое представление объекта и используете его в качестве ключа группировки в Object.groupBy(), вы должны поддерживать соответствие между исходным объектом и его представлением по мере изменения объекта.
Примечание: Чтобы получить доступ к группам в возвращаемом Map, вы должны использовать тот же объект, который изначально использовался в качестве ключа в Map (хотя вы можете изменять его свойства). Вы не можете использовать другой объект, который просто имеет то же имя и свойства.
Map.groupBy не считывает значение this. Его можно вызвать для любого объекта, и будет возвращен новый экземпляр Map.
Примеры
Использование Map.groupBy()
Сначала мы определяем массив, содержащий объекты, представляющие запасы различных продуктов питания. Каждый продукт имеет type и quantity.
const inventory = [
{ name: "asparagus", type: "vegetables", quantity: 9 },
{ name: "bananas", type: "fruit", quantity: 5 },
{ name: "goat", type: "meat", quantity: 23 },
{ name: "cherries", type: "fruit", quantity: 12 },
{ name: "fish", type: "meat", quantity: 22 },
];
Приведенный ниже код использует Map.groupBy() со стрелочной функцией, которая возвращает ключи объектов, названные restock или sufficient, в зависимости от того, имеет ли элемент quantity < 6. Возвращенный объект result является Map, поэтому нам нужно вызвать get() с ключом, чтобы получить массив.
const restock = { restock: true };
const sufficient = { restock: false };
const result = Map.groupBy(inventory, ({ quantity }) =>
quantity < 6 ? restock : sufficient,
);
console.log(result.get(restock));
// [{ name: "bananas", type: "fruit", quantity: 5 }]
Обратите внимание, что аргумент функции { quantity } является основным примером синтаксиса деструктуризации объектов для аргументов функции. Это распаковывает свойство quantity объекта, переданного в качестве параметра, и присваивает его переменной с именем quantity в теле функции. Это очень лаконичный способ доступа к соответствующим значениям элементов внутри функции.
Ключ к Map может быть изменен и по-прежнему использоваться. Однако вы не можете воссоздать ключ и по-прежнему использовать его. По этой причине важно, чтобы всё, что должно использовать эту карту (map), сохраняло ссылки на ее ключи.
// The key can be modified and still used
restock["fast"] = true;
console.log(result.get(restock));
// [{ name: "bananas", type: "fruit", quantity: 5 }]
// A new key can't be used, even if it has the same structure!
const restock2 = { restock: true };
console.log(result.get(restock2)); // undefined
Спецификации
| Спецификация |
|---|
| Спецификация языка ECMAScript® 2027 # sec-map.groupby |
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
groupBy |
117
|
117
|
119
|
103
|
17.4
16.4–17.4
|
117
|
119
|
78
|
17.4
16.4–17.4
|
24.0
|
117
|
17.4
16.4–17.4
|
1.0.19
|
1.37
|
21.0.0
|
См. также
- Полифил
Map.groupByвcore-js - Полифил es-shims для
Map.groupBy - Руководство по Индексированным коллекциям
Array.prototype.reduce()Map()Object.groupBy()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy