如何对数组先按数值排序,数值相同时再按字母顺序排序?
实现先按数值排序、数值相同按字母顺序排序的方案
没问题,我来帮你搞定这个排序需求!你需要的是先按第二个数值升序排序,当数值相同时,再按名字的字母顺序升序排序,咱们可以通过Array.sort()的自定义回调函数来实现,具体步骤如下:
核心思路
- 对数组中的每个字符串进行拆分和清理,提取出名字和目标数值;
- 先比较两个元素的数值:如果数值不同,直接按数值大小排序;
- 如果数值相同,再比较名字的字母顺序,用
localeCompare()方法实现自然的字母排序。
完整代码示例
const arr = ["Tom, 2, 6","Bill, 3, 8","Lisa, 4, 7","Charles, 2, 8"]; const sortedArr = arr.sort((a, b) => { // 拆分每个字符串并去除多余空格 const [aName, aStrNum] = a.split(',').map(item => item.trim()); const [bName, bStrNum] = b.split(',').map(item => item.trim()); // 将字符串数值转为整数,确保是数值比较而非字符串比较 const aNum = parseInt(aStrNum, 10); const bNum = parseInt(bStrNum, 10); // 第一步:按数值排序 if (aNum !== bNum) { return aNum - bNum; // 升序排序,若要降序则改为 bNum - aNum } // 第二步:数值相同时,按名字字母顺序排序 return aName.localeCompare(bName); // 升序,倒序则改为 bName.localeCompare(aName) }); console.log(sortedArr); // 输出结果:["Charles, 2, 8", "Tom, 2, 6", "Bill, 3, 8", "Lisa, 4, 7"]
细节说明
.split(',').map(item => item.trim()):拆分字符串后去除每个部分的前后空格,避免像" 2"这样的带空格字符串影响数值转换;parseInt(..., 10):明确以十进制转换字符串为整数,避免意外的八进制解析问题;localeCompare():这个方法会根据当前语言环境返回排序所需的差值,比手动比较字符编码更符合自然的字母排序逻辑,比如能正确处理大小写(默认区分,若要忽略大小写可以添加参数:aName.localeCompare(bName, undefined, { sensitivity: 'base' }))。
内容的提问来源于stack exchange,提问作者codeEnthusiast
相关产品推荐
相关产品推荐

