2016-11-09 61 views
0

我有一個包含隨機數的數組。當我嘗試通過.sort()方法對此數組進行排序時,如果數組包含重複的數字,則結果會有所不同。下面的代碼的工作方式不同在Chrome和Firefox:JavaScript。如果數組包含重複的數字,Array .sort()方法返回Chrome和Firefox的不同結果

[1,2,3,4,5,6,7,8,9,2,15,3,4,5,1,2,3,4,0,2,3].sort(function(a, b) { 
    console.log("a=", a, "b=", b) 
}) 

Plunker:http://plnkr.co/edit/Ocm1ZSXgkoCM7FQeH0v5

是否錯誤?如何解決這一行爲在Chrome和FF中有相同的結果?

+3

你'sort'功能_wrong_。由於每次比較都返回「undefined」,因此預計排序不起作用。 – vlaz

+0

@vlaz我已經更新了plunk –

+0

@vlaz請看下我的最新評論回答http://stackoverflow.com/a/40516655/5397119 –

回答

4

它適用於正確的返回值。

var array = [1,2,3,4,5,6,7,8,9,2,15,3,4,5,1,2,3,4,0,2,3]; 
 

 
array.sort(function(a, b) { 
 
    return a - b; 
 
}); 
 
console.log(array); 
 

 
array.sort(function(a, b) { 
 
    return (a & 1) - (b & 1) || a - b; 
 
}); 
 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

此代碼在Chrome和FF的console.log()中仍返回不同的結果 –

+0

我真的懷疑它 – JohnnyAW

+0

對於相同的值,排序順序不一定是穩定的。 –

2

由於sort() is not necessarily stable,您需要保存在排序前一個元素的位置,並把它作爲比較參數,如果該值是平等的,如果你想保持結果數組中的位置。但在你的情況下,問題是,你有多個值,不能只查找起始數組中的位置。您需要包裝中的對象的值:

var values= [1,2,3,4,5,6,7,8,9,2,15,3,4,5,1,2,3,4,0,2,3]; 
 
var wrappedValues = []; 
 
//first create wrapped values 
 
for(var i = 0;i < values.length;i++){ 
 
    wrappedValues.push({value : values[i], index : i}); 
 
} 
 
//now sort wrapped values 
 
wrappedValues.sort(function(a, b) { 
 
    var result = a.value % 2 - b.value % 2; 
 
    if(result == 0){ 
 
     return a.index - b.index; 
 
    } 
 
    return result; 
 
}); 
 
//now unwrappe the values: 
 
var unwrappedValues = []; 
 
wrappedValues.forEach(function(entry) { 
 
    unwrappedValues.push(entry.value); 
 
}); 
 
console.log(unwrappedValues);

BTW。你的問題的一部分是從您提供的答案比較功能:

return a % 2 - b % 2 || a - b; 

這個函數是在|| a - b排序上升 - 部分

+0

如果我沒有弄錯,那就是裝飾排序undecorate模式,雖然它通常以'.map(/ * decorate * /)完成。sort()。map (/ * undecorate * /)'這可以避免聲明中間臨時值。 – vlaz

+0

@vlaz但'.map()'創建一個新的Array,那麼這將如何避免聲明中間臨時值? O.O – JohnnyAW

+0

嗯,你不必申報。顯然它們仍然存在,但你不需要在代碼中關心它。您所需要的只是輸入 - >輸出,而一個名爲'wrappedValues'的東西僅僅是噪音。同樣,_name_'unwrappedValues'也只是噪聲 - 你真的真的在乎這些值是否曾經被包裝在_something_中,當它們被再次呈現爲普通值時呢? – vlaz

相關問題