javascript - 我们可以在对字符串数组进行排序时实现以下行为吗?
问题描述
我有一个这样的数组。
let arr = ['A1.1', 'A1.3', 'A1.2', 'A1.1 (2)', 'A1.3 (2)', 'A1.2 (2)', 'A1.1 (3)', 'A1.3 (3)', 'A1.2 (3)']
当前的排序使它像这样。我试过 sort() 方法。
let arr = ['A1.1', 'A1.1 (2)', 'A1.1 (3)', 'A1.2', 'A1.2 (2)', 'A1.2 (3)', 'A1.3', 'A1.3 (2)', 'A1.3 (3)']
我需要结果是这样的。
let arr = ['A1.1', 'A1.2', 'A1.3', 'A1.1 (2)', 'A1.2 (2)', 'A1.3 (2)', 'A1.1 (3)', 'A1.2 (3)', 'A1.3 (3)']
解决方案
一个想法是临时映射每个字符串,使括号之间的数字移动到字符串的前面,如果没有这样的部分,则将“0”放在那个位置。
Intl
然后使用本机对象的功能对其应用自然排序:
function map(s) {
// put the part in parentheses at the front of the string,
// defaulting to 0:
return ("0." + s).replace(/^0(.*)\((.*)\)$/, "$2$1");
}
// Define a collator for natural sorting:
let collator = new Intl.Collator(undefined, {
numeric: true,
sensitivity: "base"
});
// demo
let arr = ['A1.1', 'A1.3', 'A1.2', 'A1.1 (2)', 'A1.3 (2)', 'A1.2 (2)', 'A1.1 (3)', 'A1.3 (3)', 'A1.2 (3)'];
arr.sort((a, b) => collator.compare(map(a), map(b)));
console.log(arr);
推荐阅读
- here-api - 如何访问 Here Maps API PlacesResponse 中的下一个结果列表?
- python - 删除 Friends hackerearth: Runtime Error - NZEC :IndexError: deque index out of range
- c# - 如何在 C# 中从十六进制转换为转储
- node.js - 我的 ejs 页面没有像其他 ejs 页面那样加载
- angular - 浏览器操作在无头 chrome 中不起作用
- python - Python truncate 函数未按预期工作
- php - 如何在不卸载 PHP 7.4 的情况下降级或使用 PHP 7.2?是否可以默认使用 PHP 7.2 而不是最新版本?
- android - 第一次在 xamarin 表单中使用 webivew 保存空白页
- python - 向对象添加属性
- javascript - 如何将json键与json中的额外字符串连接起来?