2011-03-29 69 views
5

我的数组没有正确排序。有人能让我知道我做错了什么吗?javascript排序数组

... 
sortArray = new Array ("hello", "Link to Google", "zFile", "aFile"); 

//sort array 
     if (dir == "asc") { 
      sortArray.sort(function(a,b){return a - b}); 
     } else { 
      sortArray.sort(function(a,b){return b - a}); 
     } 

     for(var i=0; i<sortArray.length; i++) { 
      console.log(sortArray[i]); 
     } 

日志显示它们的顺序与它们输入的顺序相同。

+0

@Tim库珀的答案来解决问题相比是你需要的唯一的一个。 – 2011-03-29 17:54:00

+0

当然你也可以做这个方便的小捷径........................................ ...................'(sortArray.sort())[(dir ==='asc'?'reverse':'slice')]()' – qwertymk 2011-03-29 18:27:21

+0

@mVChr:** [DEMO](http://jsfiddle.net/pF2Gv/1/)** – qwertymk 2011-03-29 18:34:51

回答

10

你想使你的排序比较,而不是减法:

if (dir == "asc") { 
    sortArray.sort(function(a, b) { 
     a = a.toLowerCase(); 
     b = b.toLowerCase(); 
     return a === b ? 0 : a > b : 1 : -1; 
    }); 
} else { 
    sortArray.sort(function(a, b) { 
     a = a.toLowerCase(); 
     b = b.toLowerCase(); 
     return b === a ? 0 : b > a : 1 : -1; 
    }); 
} 

我也用toLowerCase()让“链接到谷歌”被适当地放置。

编辑:更新根据comment.

See example →

+0

我接受了你的toLowerCase()添加...虽然每个人都值得+1。 – PruitIgoe 2011-03-29 18:11:41

+3

这个答案在Chrome中似乎不起作用。如果a和b相等,比较函数应该返回0;如果a应该被分类到比b更高的索引,则返回正整数;如果a应该被分类到比b更低的索引,则返回负整数。 – Mike 2012-09-16 20:38:08

+1

@Mike是对的。这应该是: if(a.toLowerCase()=== b.toLowerCase()){return 0} else {return a.toLowerCase() 2016-11-03 17:04:43

7

您正试图通过减去字符串进行排序,您将得到NaN

+0

谢谢大家,很明显我误读了那个文档 - D – PruitIgoe 2011-03-29 18:10:49

6

问题在于“a-b”将字符串视为数字,它返回NaN。你会得到你正在寻找(假设你正在寻找区分大小写排序),如果你取代你的种种行为:

if (dir == "asc") { 
     sortArray.sort(function(a,b){return a < b ? -1 : 1}); 
    } else { 
     sortArray.sort(function(a,b){return b < a ? -1 : 1}); 
    } 
6

你比较函数返回NaN,因为它接收两个字符串,并执行减,在字符串上没有很好定义的操作。

你应该有更多的东西,如:

function(a,b){ 
    return a>b? 1 : (a<b ? -1 : 0); 
} 

,或者您可以使用localeCompare

function(a,b){ 
    return a.localeCompare(b); 
} 

记住要适当处理的情况下,例如"L" < "a""l" > "a"