2012-07-19 58 views
1

我想排序与自定义比较函数的数组。Javascript数组排序不正确时,许多相等的元素

比较器函数只关心两个特定元素之间的顺序。

在下面的示例中,您希望'a'在排序后出现在'b'之前,但事实并非如此。

var ar = ["b", "c", "d", "a"]; 

ar.sort(function(x, y) { 
    if (x == 'a' && y == 'b') { return -1; } 
    if (x == 'b' && y == 'a') { return 1; } 
    return 0; // only the order between 'a' and 'b' matters. 
}); 

console.log(ar); 

// ar is still ["b", "c", "d", "a"]; 

那么为什么在'b'之前不是'a'?有没有解决方法?

回答

4

想想你比较被称为在连续对您的列表:

"b", "c" --> 0 
"c", "d" --> 0 
"d", "a" --> 0 

你比较说,所有的对都相等,所以为了不需要在所有改变。

既然你不关心什么样的顺序等元素出现在(这是正确的?)然后进行比较说“a”是小于任何东西,“B”是比什么更大:

ar.sort(function(x, y) { 
    if (x == 'a' || y == "b") { return -1; } 
    if (x == 'b' || y == 'a') { return 1; } 
    return 0; // only the order between 'a' and 'b' matters. 
}); 
+0

我不在乎这个例子中其他元素的顺序。在这个问题出现的真实场景中,订单可能有多个配对。 – 2012-07-19 01:41:20

+0

我正在尝试z-sprites。当它们相交时,我可以确定哪个应该在最上面。如果精灵不相交,我从比较器返回0。 – 2012-07-19 01:53:50

0

如果'a' = 'c''b' = 'c' - 根据你的功能它是'a'也等于'b'

+0

是的,这是必须发生在这里。 – 2012-07-19 02:00:12

0

这样的Array.prototype.sort功能的觉得...

Array.prototype.sort = function(sortFunc){ 
    if(typeof sortFunc !== "function"){ 
     sortFunc = function(a,b){ 
      return a-b; 
     } 
    } 
    var arr = []; 
    for(var i = 0, len = arr.length; i <= len; i++){ 
     sortFunc(arr[i], arr[i+1]); 
    } 
    return arr; 
} 

正如你可以看到Array.prototype.sort只与相隔仅一个单元要素供应sortFunc功能。

所以sortFunc(“b”,“a”)不会发生,因为它们的索引相距不到1个单位。