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
相关产品推荐
相关产品推荐

