使用包含字母和数字的名称 属性 对对象数组进行排序
Sorting array of objects using name propery which contains alphabet and numbers using
我正在使用 Reactjs 和 underscore.js 开发应用程序。我正在尝试使用字符串名称对列表进行排序。但是,名称中包含数字,因此排序不正确。这是我的代码及其结果的示例:
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)
我怎样才能做到这一点?
简答:
您正在寻找的术语是“自然排序”,这不是您可以在一行中轻松实现的。
下划线使它变得更加困难,因为它没有为您提供 2 个元素进行比较,而只有 1 个元素提供用于比较的度量。
您可以找到大量示例:
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]);
});
它只是比较字符串中的第一个数字(不是数字)。
可以通过使用 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>')
})
<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>
我相信这可以用更简洁的方式编写。如果我有时间,我稍后会尝试编辑它,但这应该可以。
我正在使用 Reactjs 和 underscore.js 开发应用程序。我正在尝试使用字符串名称对列表进行排序。但是,名称中包含数字,因此排序不正确。这是我的代码及其结果的示例:
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)
我怎样才能做到这一点?
简答: 您正在寻找的术语是“自然排序”,这不是您可以在一行中轻松实现的。
下划线使它变得更加困难,因为它没有为您提供 2 个元素进行比较,而只有 1 个元素提供用于比较的度量。
您可以找到大量示例:
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]);
});
它只是比较字符串中的第一个数字(不是数字)。
可以通过使用 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>')
})
<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>
我相信这可以用更简洁的方式编写。如果我有时间,我稍后会尝试编辑它,但这应该可以。