【问题标题】:Sorting array of objects using name propery which contains alphabet and numbers using使用包含字母和数字的名称属性对对象数组进行排序
【发布时间】:2016-11-14 21:41:03
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: javascript sorting reactjs underscore.js


    【解决方案1】:

    简短回答: 您正在寻找的术语是“自然排序”,这不是您可以在 1 行中轻松实现的。

    下划线让它变得更加困难,因为它没有为您提供 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]);
    });
    

    它只是比较字符串中的第一个数字(不是数字)。

    【讨论】:

    • 谢谢,我最终使用了 Javascript 中的解决方案:自然排序的字母数字字符串。
    【解决方案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>')
    })
    <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>

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

    【讨论】:

    • 不错的技巧,但它不起作用有两个原因。首先,按 substring(1) 排序仍然是字母而不是数字。其次,最终排序完全覆盖除相等元素之外的顺序。一组相等元素中的相对顺序保留了先前的排序。最后的排序应该是第一个字母,并且有例如S按数字排序,您应该按数字部分预先排序。 按最终排序中的第一个字母进行排序很重要,这样所有的 S 都将被视为相等并保留它们的相对顺序。
    猜你喜欢
    • 2021-06-30
    • 2012-04-26
    • 2022-06-30
    • 2021-11-19
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多