You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS实现groupBy函数:按回调返回值分组 元素存入数组避免被覆盖

问题分析

你当前编写的groupBy函数直接将元素赋值给对象属性,由于同一回调返回值对应的属性会被后续元素覆盖,导致最终每个键仅保留最后一个匹配元素,而非存放所有匹配元素的数组。

修正方案

在每次给对象属性赋值前先做初始化判断:如果对象上不存在当前回调返回的键,先将该属性初始化为空数组,再往数组中推入当前元素即可。
修正后的代码如下:

function groupBy(array, callback) {
  const obj = {};

  array.forEach((el) => {
    const evaluated = callback(el);
    // 首次遇到该分组键时,先初始化为空数组
    if (!obj[evaluated]) {
      obj[evaluated] = [];
    }
    // 往对应数组中推入当前元素
    obj[evaluated].push(el);
  });
  return obj
}

const decimals = [1.3, 2.1, 2.4];
const floored = function(num) {
  return Math.floor(num);
};
console.log(groupBy(decimals, floored)); // 输出:{ 1: [1.3], 2: [2.1, 2.4] }
逻辑说明
  • 遍历原数组的每个元素,调用回调得到对应分组键
  • 首次遇到某个分组键时,给对象对应的属性创建空数组作为容器
  • 所有匹配该分组键的元素都会被推入对应数组,不会出现值覆盖的问题

内容的提问来源于stack exchange,提问作者Winslow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:09:02