本文详细介绍在JavaScript中对数组按属性进行分组的几种常见实现方式。通过示例代码演示了如何使用forEach和reduce方法,分别针对无属性名数组和有属性名数组进行分组操作,帮助开发者掌握高效的数据处理技巧。
前言
在实际项目开发中,经常需要根据特定条件对数据进行属性分组处理。
1、使用forEach实现
let arr = [
{name: '张三', age: 18},
{name: '李四', age: 20},
{name: '王五', age: 18},
{name: '赵六', age: 20},
{name: '孙七', age: 21},
];
let obj = {};
arr.forEach(item => {
if (!obj[item.age]) {
obj[item.age] = [];
}
obj[item.age].push(item);
});
console.log(obj);
// {
// 18: [{name: '张三', age: 18}, {name: '王五', age: 18}],
// 20: [{name: '李四', age: 20}, {name: '赵六', age: 20}],
// 21: [{name: '孙七', age: 21}],
// }2、使用reduce实现
利用JavaScript的Array.prototype.reduce()方法可以实现数组分组。这是一种较为高级的处理方式,能够将数组元素聚合为单一值。在此场景下,可将数组元素存入对象,其中对象的键为分组条件,值为满足该条件的元素组成的数组。
例如,假设存在一个包含多人信息的数组,需要按性别进行分组:
const people = [
{ name: 'Alice', gender: 'female' },
{ name: 'Bob', gender: 'male' },
{ name: 'Charlie', gender: 'male' },
{ name: 'Diana', gender: 'female' },
];
const groups = people.reduce((groups, person) => {
const key = person.gender;
if (!groups[key]) {
groups[key] = [];
}
groups[key].push(person);
return groups;
}, {});
console.log(groups);
// Output:
// {
// female: [
// { name: 'Alice', gender: 'female' },
// { name: 'Diana', gender: 'female' },
// ],
// male: [
// { name: 'Bob', gender: 'male' },
// { name: 'Charlie', gender: 'male' },
// ],
// }上述代码调用了reduce()方法,该方法接收一个回调函数及初始值。回调函数的参数包括每次遍历时的累计值(即groups变量)和当前元素(即person变量)。每次遍历时,回调函数返回新的累计值。本例中,累计值为一个对象,它
3、对无属性名数组进行分组
若需按特定规则将数组元素分为多组,可使用JavaScript中的Array.prototype.reduce()方法。
例如,假设有一个数组,需按奇偶性将其分为两组,代码如下:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const groupBy = (arr, fn) =>
arr.reduce((acc, el) => {
const key = fn(el);
if (!acc[key]) {
acc[key] = [];
}
acc[key].push(el);
return acc;
}, {});
const groups = groupBy(numbers, (n) => (n % 2 === 0 ? 'even' : 'odd'));
console.log(groups);
// Output:
// {
// even: [2, 4, 6, 8],
// odd: [1, 3, 5, 7, 9]
// }在上述代码中,定义了一个名为groupBy的函数,接收两个参数:待分组数组及一个根据元素属性或特征返回唯一键的函数。随后,利用reduce() 方法遍历数组所有元素,并根据返回的键将元素分组至累加器对象中。
也可通过此方法按任意规则对数组元素进行分组,只需调整分组函数即可。
4、对具有属性名的数组进行分组
实现数组分组可采用以下方法:
1. 使用reduce()方法:
function groupBy(arr, key) {
return arr.reduce((acc, curr) => {
(acc[curr[key]] = acc[curr[key]] || []).push(curr);
return acc;
}, {});
}使用方法如下:
const people = [
{ name: 'Alice', age: 21 },
{ name: 'Bob', age: 22 },
{ name: 'Charlie', age: 23 },
{ name: 'Dave', age: 24 },
{ name: 'Eve', age: 22 },
];
const groupedPeople = groupBy(people, 'age');
console.log(groupedPeople);
// 打印结果:
// {
// 21: [{ name: 'Alice', age: 21 }],
// 22: [{ name: 'Bob', age: 22 },{ name: 'Eve', age: 25 }],
// 23: [{ name: 'Charlie', age: 23 }],
// 24: [{ name: 'Dave', age: 24 }],
// }2. 结合map()和reduce()方法:
function groupBy(arr, key) {
return arr.map(item => item[key]).reduce((acc, curr, i) => {
acc[curr] = acc[curr] || [];
acc[curr].push(arr[i]);
return acc;
}, {});
}使用方法与第一种方式相同。
需注意,上述方法均基于原始数组进行分组,并创建一个新对象,该对象包含将数组元素分组到相应分组的属性。若需在原始数组上直接分组,可采用以下方法:
使用Array.prototype.forEach()方法:
function groupBy(arr, key) {
arr.forEach(item => {
item[key] = item[key] || [];
item[key].push(item);
});
}使用方法如下:
const people = [
{ name: 'Alice', age: 21 },
{ name: 'Bob', age: 22 },
{ name: 'Charlie', age: 23 },
{ name: 'Dave', age: 24 },
{ name: 'Eve', age: 22 },
];
groupBy(people, 'age');
console.log(people);
// 打印结果:
// [
// { name: 'Alice', age: 21, ageGroup: [{ name: 'Alice', age: 21 }] },
// { name: 'Bob', age: 22, ageGroup: [{ name: 'Bob', age: 22 }] },
// { name: 'Charlie', age: 23, ageGroup: [{ name: 'Charlie', age: 23 }] },
// { name: 'Dave', age: 24, ageGroup: [{ name: 'Dave', age: 24 }] },
// { name: 'Eve', age: 25, ageGroup: [{ name: 'Eve', age: 25 }] }
// ]3. 使用map()方法:
function groupBy(arr, key) {
return arr.map(item => {
item[key] = item[key] || [];
item[key].push(item);
return item;
});
}使用方法与第一种方式相同。
需注意,上述方法均基于原始数组进行分组,并将每个元素分组至原始数组中的相应元素。若需创建新数组,建议使用前两种方法。
总结
至此,关于JavaScript数组按属性分组的介绍完毕。如需了解更多JS数组分组相关内容,可搜索本站往期文章或继续浏览下方相关文章。感谢大家的支持!