我正在使用Reactjs和underscore.js开发一个应用程序。我正在尝试使用name作为字符串对列表进行排序。但是,名称包含数字,因此排序不正确。以下是我的代码及其结果的示例:
items= _.sortBy(items, function (item) {
return item.name.toLowerCase()
});
结果:
S1.2M (FA)
S10.1M
S10.2M
S10.4M
S11 (GR14)
S2 (DT)
S3.1M (GR17)
但我希望结果如下:
S1.2M (FA)
S2 (DT)
S3.1M (GR17)
S10.1M
S10.2M
S10.4M
S11 (GR14)
我怎样才能做到这一点?
答案 0 :(得分:2)
简短回答: 您正在寻找的术语是“自然分类”,这不是您可以轻松实现的一行。
下划线让它变得更难,因为它不会为你提供2个要比较的元素,而只是提供一个比较的度量。
你可以找到很多例子:
Javascript : natural sort of alphanumerical strings
和强>
Underscore.js sort an array of objects alphanumerically
使用underscorejs最接近的是:
_.sortBy(items, function (a) {
return parseInt(a.match(/\d+/)[0]);
});
只是比较字符串中的第一个数字(不是数字)。
答案 1 :(得分:2)
可以使用sortBy()两次完成。
var items = [
{"name":"S1.2M (FA)"},
{"name":"S10.1M"},
{"name":"S10.2M"},
{"name":"S10.4M"},
{"name":"S11 (GR14)"},
{"name":"S2 (DT)"},
{"name":"S3.1M (GR17)"}
]
//sort by alphabetical order
items = _.sortBy(items, function (item) {
return item.name.toLowerCase()
})
//sort while ignoring first character
items = _.sortBy(items, function(item) {
return item.name.substring(1);
});
_.each(items, function(item) {
$('ul').append('<li>'+item.name+'</li>')
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script>
<ul></ul>
&#13;
我确信这可以用更干净的方式编写。如果我有时间,我会稍后尝试编辑它,但这应该有效。