JavaScript数组按属性分组的多种实现方式

作者:木棉

时间:2026-10-30

浏览:622

本文详细介绍在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数组分组相关内容,可搜索本站往期文章或继续浏览下方相关文章。感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章