如何基于字符组成模式对JavaScript数组中的字符串元素进行分组?
实现思路
你的分组规则本质是将互为变位词(字符组成完全相同、仅顺序不同)的字符串归为同一组,长度不同的字符串必然不属于同一组。通用实现的核心是为每个字符串生成唯一的分组标识,同组字符串的标识完全一致:
- 把每个字符串拆分为字符数组,按字母顺序排序后重新拼接为字符串,作为分组标识
- 比如
abc、bca、acb排序后拼接的结果都是abc,属于同一组;bdc、cbd排序后拼接结果都是bcd,属于同一组 - 用映射结构存储分组,键为上述分组标识,值为对应组的字符串数组
- 遍历完成后提取映射中所有值,即可得到最终分组结果
可用实现代码
const sequence = ["abc", "abcd", "bca", "bdc", "cbd", "bdc", "acb"]; // 生成分组标识的工具函数 function getGroupKey(str) { return str.split('').sort().join(''); } // 使用Map存储分组可保留分组首次出现的顺序 const groupMap = new Map(); for (const item of sequence) { const key = getGroupKey(item); if (!groupMap.has(key)) { groupMap.set(key, []); } groupMap.get(key).push(item); } // 提取所有分组得到最终结果 const finalSequence = Array.from(groupMap.values()); console.log(finalSequence);
运行后输出和你给出的期望结果一致。如果需要调整分组的输出顺序,只需对finalSequence做二次排序即可。
原有代码的问题
- 硬编码了3个存储分组的变量,无法适配分组数量变化的测试用例
- 循环逻辑存在缺陷,
forEach内部循环每次都会覆盖三个数组的值,最终拿到的只是遍历到最后一个元素时的计算结果,不具备通用性
内容的提问来源于stack exchange,提问作者MiniDracaena
相关产品推荐
相关产品推荐

