如何按priorityTag属性值对数组元素进行分组?
实现按priorityTag分组已排序数组的方法
既然你已经搞定了数组按priorityTag排序的环节,接下来的分组工作就很简单了!因为数组已经是有序的,相同priorityTag的元素肯定是连续排列的,我们只需要一次遍历就能高效完成分组,不需要额外的排序或复杂查找。
修改后的完整代码
sortFeaturesPerPriority2(arr) { logger.debug('[sortFeaturesPerPriority2]: Array.isArray(arr):', Array.isArray(arr)); logger.debug('[sortFeaturesPerPriority2]: arr:', arr); logger.debug('[sortFeaturesPerPriority2]: arr.length:', arr.length); // 先执行你原有的排序逻辑,这里用浅拷贝避免修改原数组(可选,根据你的需求调整) const sortedArr = [...arr].sort((a, b) => a.getPriorityTag() - b.getPriorityTag()); logger.debug('[sortFeaturesPerPriority2]: sortedArr:', sortedArr); // 处理空数组的边界情况 if (sortedArr.length === 0) { return []; } // 核心分组逻辑:利用reduce累积分组 const groupedArr = sortedArr.reduce((groups, currentItem) => { const currentTag = currentItem.getPriorityTag(); const lastGroup = groups[groups.length - 1]; // 因为数组已排序,相同标签的元素必然连续,只需判断最后一组的标签是否匹配 if (lastGroup && lastGroup[0].getPriorityTag() === currentTag) { lastGroup.push(currentItem); } else { groups.push([currentItem]); } return groups; }, []); logger.debug('[sortFeaturesPerPriority2]: groupedArr:', groupedArr); return groupedArr; }
代码逻辑说明
- 浅拷贝数组:我用
[...arr]做了一次浅拷贝再排序,这样不会修改原数组的引用——如果你不需要保留原数组,可以直接用arr.sort()覆盖原数组。 - 边界处理:先判断数组是否为空,避免后续遍历出错。
- reduce分组:
- 初始化一个空数组
groups作为分组容器。 - 遍历每个元素时,取出当前元素的
priorityTag,再对比最后一个分组的第一个元素的标签(因为数组有序,同标签元素连续,所以只需检查最后一组)。 - 如果标签匹配,就把当前元素加入最后一组;不匹配则新建一个包含当前元素的分组,加入
groups。
- 初始化一个空数组
示例效果
针对你提供的输入数组,执行后会得到如下结构的分组数组:
[ // group1 [{prop1: "aaa1", prop2:"yas1", priorityTag:100}, {prop1: "aaa3", prop2:"yas3", priorityTag:100}], // group2 [{prop1: "aaa2", prop2:"yas2", priorityTag:200}, {prop1: "aaa4", prop2:"yas4", priorityTag:200}], // group3 [{prop1: "aaa5", prop2:"yas5", priorityTag:300}, {prop1: "aaa7", prop2:"yas7", priorityTag:300}], // group4 [{prop1: "aaa6", prop2:"yas6", priorityTag:400}, {prop1: "aaa8", prop2:"yas8", priorityTag:400}], // group5 [{prop1: "aaa9", prop2:"yas9", priorityTag:500}], // group6 [{prop1: "aaa10", prop2:"yas10", priorityTag:700}, {prop1: "aaa11", prop2:"yas11", priorityTag:700}] ]
这种方法的时间复杂度是O(n)(排序是O(n log n),但你已经完成了排序,所以分组环节是线性的),非常高效。
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

