使用包含字母和数字的名称 属性 对对象数组进行排序

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>

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