javascript - 当某些值有点时,如何按字母数字对数组进行排序?
问题描述
我很想知道如何对这种值进行排序:
let sizesArray =
[
"Size : US 5.5Y (EU 38)",
"Size : US 6.5Y (EU 39)",
"Size : US 4.5Y (EU 36.5)",
"Size : US 6Y (EU 38.5)",
"Size : US 7Y (EU 40)",
"Size : US 4Y (EU 36)",
]
我是这样排序的:
// Create rules for sorting product sizes.
const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true})
// Sorting product Sizes.
let sortedSizes = sizesArray.sort(sortAlphaNum);
结果 :
[
"Size : US 4.5Y (EU 36.5)",
"Size : US 4Y (EU 36)",
"Size : US 5.5Y (EU 38)",
"Size : US 6.5Y (EU 39)",
"Size : US 6Y (EU 38.5)",
"Size : US 7Y (EU 40)"
]
如您所见, 4Y 排在 4.5Y 之后!只是因为当它将 4" Y " 与 4" . "5Y 进行比较时,点在所有 alpha 之前。怎么做反转?
我也使用的格式:
"US 5.5 (EU 38)"
"US 5.5Y (EU 38)"
"W US 9.5 / US 8 (EU 41)"
"US 4.5 (EU 36 2/3)"
它适用于除第二个之外的所有人。
提前致谢。:)
解决方案
如果您的字符串始终采用这种格式,您可以使用一点正则表达式来解析数字并将它们作为数字而不是字符串进行比较。
let sizesArray = [
"Size : US 5.5Y (EU 38)",
"Size : US 6.5Y (EU 39)",
"Size : US 4.5Y (EU 36.5)",
"Size : US 6Y (EU 38.5)",
"Size : US 7Y (EU 40)",
"Size : US 4Y (EU 36)",
]
sizesArray.sort((a, b) => {
return +a.match(/US\s([\d\.]*)/)[1] - +b.match(/US\s([\d\.]*)/)[1];
});
console.log(sizesArray);
PS。将对数组进行就地sort
排序,因此将内存分配给将引用与原始变量相同的数组的新变量没有多大意义:
// sortedSizes === sizesArray
// Both arrays are exactly the same object
let sortedSizes = sizesArray.sort(sortAlphaNum)
推荐阅读
- javascript - Leaflet / LayersControl / 移动设备上的自定义按钮
- unreal-engine4 - 我在与对象交互时连续降低健康,但只有在你触摸对象时才会降低
- javascript - discordjs/语音不播放音频
- substrate - 带有 polkadot-launch 的本地 [Polkadot + Statemine] 测试网
- gdb - GDB mi 解释器返回空 -symbol-info-functions
- activemq-artemis - Apache ActiveMQ Artemis 日志记录解释
- python - 优先队列缓存问题(Java/Python)
- java - 使用自定义 setter 或自定义注解修改 POJO 类字段(在 Spring Boot 中)
- apache-drill - 在读取大量 json 文件并输出到单个文件时,是否有任何设置可以避免在 apache Drill 中使用所有内存?
- r - 将 data.frame 拆分为矩阵并将对角元素相乘以生成新列