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

Node.js中按指定条件分组拆分数组并格式化输出的最优方案

Node.js 按title分组格式化输出最优实现

最推荐的实现是单次遍历拼接方案,无第三方依赖、时间复杂度最优、内存占用最低,兼容所有Node.js版本,代码如下:

/**
 * 将输入数组按title分组、按要求格式输出字符串
 * @param {Array<{title: string, text: string}>} details 输入数组
 * @returns {string} 格式化后的结果字符串
 */
function printFormattedDetails(details) {
  // 按title字段字母顺序排序
  details.sort((a, b) => a.title.localeCompare(b.title));

  const resultLines = [];
  let activeGroupTitle = null;

  // 一次遍历完成分组判断和内容拼接,无额外循环开销
  for (const item of details) {
    // 命中新分组时,先插入标题行
    if (item.title !== activeGroupTitle) {
      activeGroupTitle = item.title;
      resultLines.push(activeGroupTitle);
    }
    // 插入当前项的列表行
    resultLines.push(`- ${item.text}`);
  }

  return resultLines.join('\n');
}

// 调用示例
const input = [
  {title: "TITLE A", text: "element 1"},
  {title: "TITLE C", text: "element 2"},
  {title: "TITLE B", text: "element 4"},
  {title: "TITLE A", text: "element 3"},
  {title: "TITLE B", text: "element 5"}
];

console.log(printFormattedDetails(input));

运行上述代码会完全输出要求的格式:

TITLE A
- element 1
- element 3
TITLE B
- element 4
- element 5
TITLE C
- element 2

方案优势

  • 性能最优:排序阶段时间复杂度为O(nlogn),拼接阶段仅做一次全量遍历O(n),比「先构造分组映射对象、再遍历对象拼接」的方案少一次全量循环,处理大数组时性能差距明显。
  • 兼容性好:不依赖ES2024新增API,也不需要引入lodash等第三方工具库,在所有维护期内的Node.js版本上都可以直接运行。
  • 内存占用低:不需要额外维护分组的临时对象结构,遍历过程中直接生成最终输出的行数组,额外内存开销最小。

高版本Node.js简化写法

如果你使用的是Node.js 21.0.0及以上版本,可以用原生的Object.groupByAPI简化分组逻辑,代码可读性更高,仅在极大数据量下性能略低于上面的最优方案:

function printFormattedDetailsModern(details) {
  details.sort((a, b) => a.title.localeCompare(b.title));
  const grouped = Object.groupBy(details, item => item.title);
  // 去重得到按顺序排列的title列表
  const titleOrder = [...new Set(details.map(i => i.title))];
  
  return titleOrder.map(title => {
    const items = grouped[title].map(i => `- ${i.text}`).join('\n');
    return `${title}\n${items}`;
  }).join('\n');
}

注意事项

如果需要严格按照ASCII编码顺序排序、不受运行环境本地字符集影响,可以把排序比较逻辑替换为如下写法,避免不同locale下排序结果不符合预期:

details.sort((a, b) => a.title < b.title ? -1 : a.title > b.title ? 1 : 0);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:03:39