【问题标题】:Sorting an array in javascript: [duplicate]在javascript中对数组进行排序:[重复]
【发布时间】:2012-11-05 11:27:42
【问题描述】:

可能重复:
Sort mixed alpha/numeric array

我正在尝试对包含 xxx1、xxx2、xxx3 形式的元素的数组进行排序。 Array.sort() 方法在 xxx9 之前工作正常,如果有一个名为 xxx10 或 xxx11 的元素,它会失败。顺序为 xxx1、xxx10、xxx11、xxx2 等。请告诉我如何解决此问题。

【问题讨论】:

  • 这是预期的行为。寻找自然的排序实现。
  • 发布一些代码。我认为你需要转换你的数字。

标签: javascript arrays


【解决方案1】:

您正在看到自然字符串排序的结果。如果字符串排序不是您想要的,您应该使用自己的比较器。

做一些类似的事情:

arrayToBeSorted.sort(function(first,second)
{ 
  /* some code that compares 'first' with 'second' and returns <0, ==0, >0*/ 
});

【讨论】:

    【解决方案2】:

    目前您的数组按字母顺序排序,这就是您获得这些结果的原因。您需要提供自己的比较器函数来实现数字排序。

    试试

    var arr = ["xxx1","xxx10","xxx2","xxx20","xxx3","xxx30"];
    
    var sortedArr = arr.sort( function( a, b ) {
    
        // remove first 3 characters so remaining string will parse
        a = parseInt( a.substr( 3 ) );
        b = parseInt( b.substr( 3 ) );
    
        return a - b;
    });
    
    console.log( sortedArr ); // => ["xxx1", "xxx2", "xxx3", "xxx10", "xxx20", "xxx30"]
    

    【讨论】:

    • 嗨..这很好用。非常感谢。
    【解决方案3】:

    您可以在回调中实现自定义排序条件以传递给Array.sort()

    ​var arr = [],
        re = /^\D*(\d+)$/;
    
    for(var i = 20; i-- > 0;) {
        arr.push('xxx' + i);
    }
    
    function comparator(a, b) {
        var numA = a.match(re)[1],
            numB = b.match(re)[1];
        return numA - numB;
    }
    
    arr.sort(comparator);
    console.log(arr);
    ​
    

    http://jsfiddle.net/f0t0n/qz62J/

    【讨论】: