lodash - Lodash 使用 Alphanumberic 排序不正确?
问题描述
我正在使用 lodash 对数组进行排序。
前任:
const arr = [ { name: 'Card 2' }, { name: 'Card 1' }, { name: 'Card 10' }]
种类:
lodash.orderBy(arr, ['name'], ['asc'])
结果:
[{ name: 'Card 1' }, { name: 'Card 10' }, { name: 'Card 2' }]
我该如何解决?我期望结果应该是:
[ { name: 'Card 1' }, { name: 'Card 2' }, { name: 'Card 10' }]
解决方案
它是正确的。您正在按字典顺序排序。就像“土豚”在“a”之后和“b”之前一样,“10”也在“1”之后但在“2”之前。如果要按数字对其进行排序,则需要提取数字。
在这里,我将每个数组分成字母和数字部分,然后用零填充数字部分,以便可以像字符串一样比较它们(例如"Card 0000000000000010"
):
const arr = [ { name: 'Card 2' }, { name: 'Card 1' }, { name: 'Card 10' }, { name: 'Document 1' }]
const sortedArr = _.sortBy(arr, [function(o) {
const split = o.name.split(/\b(\d+)\b/);
for (let i = 1; i < split.length; i += 2) {
split[i] = split[i].padStart(16, '0');
}
return split.join('');
}]);
console.log(sortedArr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
推荐阅读
- javascript - 如何在 Firebase 功能中转换印度地区的时间
- msys2 - 带有 GTK 的 Windows 10 中的 Msys2 返回错误 pkg-config
- c# - HTTP PostAsync 不返回任何内容
- c# - 通过回调将等待应用于任务
- json - Wiremock 独立 JSON response.ok 等于 false 从未达到
- javascript - JS函数在反应中没有在字符串html中被调用
- javascript - 在javascript函数中调用onclick按钮内的外部函数
- go - jemalloc 没有用 cgo 显示 go 代码的行号
- python - google.api_core.exceptions.ResourceExhausted:429 查询 bigquery 时收到的消息大于最大值
- kubernetes - 添加了 kubernetes ServiceMonitor 但未发现目标(0/0 向上)