2012-11-05 48 views
2

可能重复:
Sort mixed alpha/numeric array排序在JavaScript的数组:

我试图排序包含在XXX1,XXX2,XXX3的形式元素的数组。 Array.sort()方法正常工作,直到xxx9,并且如果名称为xxx10或xxx11的元素失败。顺序为xxx1,xxx10,xxx11,xxx2等等。请让我知道如何解决这个问题。

+1

显示一些代码... – Lloyd

+3

这是预期的行为。寻找一个自然的排序实现。 –

+2

向我们显示代码。 – Thalaivar

回答

0

目前你的数组按字母顺序排序,这就是为什么你会得到这些结果。您需要提供自己的比较器功能来实现数字排序。

尝试

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"] 
+0

嗨,这工作正常。非常感谢。 – CARTIC

+0

不客气。 – Bruno

3

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

做这样的事情:

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

this后如何实现自然排序看看。

Array.prototype.alphanumSort = function(caseInsensitive) { 
    for (var z = 0, t; t = this[z]; z++) { 
    this[z] = []; 
    var x = 0, y = -1, n = 0, i, j; 

    while (i = (j = t.charAt(x++)).charCodeAt(0)) { 
     var m = (i == 46 || (i >=48 && i <= 57)); 
     if (m !== n) { 
     this[z][++y] = ""; 
     n = m; 
     } 
     this[z][y] += j; 
    } 
    } 

    this.sort(function(a, b) { 
    for (var x = 0, aa, bb; (aa = a[x]) && (bb = b[x]); x++) { 
     if (caseInsensitive) { 
     aa = aa.toLowerCase(); 
     bb = bb.toLowerCase(); 
     } 
     if (aa !== bb) { 
     var c = Number(aa), d = Number(bb); 
     if (c == aa && d == bb) { 
      return c - d; 
     } else return (aa > bb) ? 1 : -1; 
     } 
    } 
    return a.length - b.length; 
    }); 

    for (var z = 0; z < this.length; z++) 
    this[z] = this[z].join(""); 
} 
0

可以实现自定义的回调整理状态,以进入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/