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

如何按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;
}

代码逻辑说明

  1. 浅拷贝数组:我用[...arr]做了一次浅拷贝再排序,这样不会修改原数组的引用——如果你不需要保留原数组,可以直接用arr.sort()覆盖原数组。
  2. 边界处理:先判断数组是否为空,避免后续遍历出错。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:17:03