使用名称propery对对象数组进行排序,其中包含字母和数字

时间:2016-07-12 14:56:51

标签: javascript sorting reactjs underscore.js

我正在使用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)

我怎样才能做到这一点?

2 个答案:

答案 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;
&#13;
&#13;

我确信这可以用更干净的方式编写。如果我有时间,我会稍后尝试编辑它,但这应该有效。