当前位置:首页 > JavaScript

js实现分组函数

2026-04-07 15:45:29JavaScript

实现分组函数的方法

在JavaScript中,分组函数通常指将数组元素按照特定条件分组,生成一个对象或Map,其中键是分组条件,值是对应的元素数组。以下是几种常见的实现方式:

使用Array.reduce()方法

通过reduce遍历数组,根据分组条件构建结果对象:

function groupBy(arr, key) {
  return arr.reduce((acc, item) => {
    const groupKey = typeof key === 'function' ? key(item) : item[key];
    (acc[groupKey] = acc[groupKey] || []).push(item);
    return acc;
  }, {});
}

// 示例用法
const data = [
  { category: 'fruit', name: 'apple' },
  { category: 'vegetable', name: 'carrot' },
  { category: 'fruit', name: 'banana' }
];
console.log(groupBy(data, 'category'));
// 输出: { fruit: [...], vegetable: [...] }

使用Map数据结构

如果需要保持分组键的顺序或键可能是非字符串类型,可以使用Map:

function groupByToMap(arr, keyFn) {
  const map = new Map();
  arr.forEach(item => {
    const key = keyFn(item);
    if (!map.has(key)) map.set(key, []);
    map.get(key).push(item);
  });
  return map;
}

// 示例用法
console.log(groupByToMap(data, item => item.category));

按多个条件复合分组

实现多级分组,例如先按category再按subCategory:

function multiGroupBy(arr, keys) {
  return arr.reduce((acc, item) => {
    const keyPath = keys.map(k => item[k]).join('|');
    (acc[keyPath] = acc[keyPath] || []).push(item);
    return acc;
  }, {});
}

性能优化版本

对于大数据量,可优化分组过程:

js实现分组函数

function optimizedGroupBy(arr, key) {
  const result = Object.create(null);
  for (let i = 0; i < arr.length; i++) {
    const item = arr[i];
    const groupKey = typeof key === 'function' ? key(item) : item[key];
    let group = result[groupKey];
    if (group) {
      group.push(item);
    } else {
      result[groupKey] = [item];
    }
  }
  return result;
}

注意事项

  • 如果分组键可能为undefinednull,需要特殊处理
  • 大型数组分组时,考虑使用for循环代替reduce以获得更好性能
  • 分组函数可以是字符串属性名,也可以是返回分组键的函数

以上方法覆盖了大多数分组场景,可根据具体需求选择合适实现方式。

标签: 函数js
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…