一、什麼是數據分組?
在數據分析和處理中,我們常常需要按照某些屬性對數據進行聚合操作。以一個包含多個對象的數組為例,我們可以按照對象的某個屬性,將數組分成若干個小數組,每個小數組包含具有相同屬性值的對象,這就是數據分組的操作。
例如,下面是一個包含若干個對象的數組:
const users = [
{id:1, name:'張三', age:20, gender:'男'},
{id:2, name:'李四', age:22, gender:'男'},
{id:3, name:'王五', age:23, gender:'女'},
{id:4, name:'趙六', age:25, gender:'男'},
{id:5, name:'錢七', age:22, gender:'女'}
];
我們可以按照年齡屬性進行分組:
// 按照年齡分組
const groups = groupBy(users, 'age');
console.log(groups);
/* 輸出
{
"20": [
{ "id": 1, "name": "張三", "age": 20, "gender": "男" }
],
"22": [
{ "id": 2, "name": "李四", "age": 22, "gender": "男" },
{ "id": 5, "name": "錢七", "age": 22, "gender": "女" }
],
"23": [
{ "id": 3, "name": "王五", "age": 23, "gender": "女" }
],
"25": [
{ "id": 4, "name": "趙六", "age": 25, "gender": "男" }
]
}
*/
按照年齡屬性分組後,返回的對象中,每個小數組包含了具有相同年齡的對象。
二、如何高效實現數據分組?
實現數據分組的方法有很多種,但是如何高效實現數據分組呢?下面介紹兩種高效的實現方法,分別是使用reduce方法和Map對象。
三、使用reduce方法實現數據分組
reduce方法可以對數組中的每個元素進行聚合操作。我們可以使用reduce方法,對每個屬性值進行分組聚合。
/**
* 按照指定屬性對數據進行分組聚合
* @param {Array} data - 數據數組
* @param {String} key - 屬性名
* @returns {Object} - 分組聚合後的對象
*/
function groupBy(data, key) {
return data.reduce((result, item) => {
const groupKey = item[key];
if (!result[groupKey]) {
result[groupKey] = [];
}
result[groupKey].push(item);
return result;
}, {});
}
使用reduce方法實現數據分組的核心代碼就是上面的函數。這個函數接受兩個參數,一個是數據數組,一個是屬性名。reduce方法對每個元素進行聚合操作,這裡使用了一個result變量來保存聚合結果,在遍歷每個元素時,首先獲取元素的屬性值,然後判斷這個屬性值是否已經存在於result變量中,如果不存在,則新建一個數組,並將這個數組加入到result變量中,如果存在,則直接將元素加入到對應的數組中,最後返回result變量。
四、使用Map對象實現數據分組
Map對象是ES6中的一個新的數據結構,它接受一個可迭代對象作為參數,可以將其中每個元素作為鍵值對存儲在Map對象中,並提供了一些方法用於操作這些鍵值對。
/**
* 按照指定屬性對數據進行分組聚合
* @param {Array} data - 數據數組
* @param {String} key - 屬性名
* @returns {Object} - 分組聚合後的對象
*/
function groupBy(data, key) {
const groups = new Map();
data.forEach(item => {
const groupKey = item[key];
if (!groups.has(groupKey)) {
groups.set(groupKey, []);
}
groups.get(groupKey).push(item);
});
return Object.fromEntries(groups);
}
使用Map對象實現數據分組的核心代碼就是上面的函數。這個函數接受兩個參數,一個是數據數組,一個是屬性名。首先創建一個空的Map對象,然後遍曆數據數組,對每個元素進行操作,獲取屬性值,判斷這個屬性值是否已經存在於Map對象中,如果不存在,則新建一個空數組,並將這個數組存入Map對象中,如果存在,則直接將元素加入到對應的數組中,最後將Map對象轉化為一個普通對象,返回即可。
五、結語
使用reduce方法和Map對象,我們可以高效地實現數據分組操作。在實際開發中,數據分組是一個非常常見的操作,如果我們掌握了高效實現數據分組的方法,可以更便捷地處理和分析數據,提高代碼的效率和可維護性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/159155.html