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

