2012-07-23 95 views
2

我在這方面花了相當多的時間,並且無法在這裏發現錯誤。在多維數組中排序失敗

本質上,我有一個多元數組,其類型var test_arr = [['79',0],['8',1],['30', 2],['580',3],['59',4]],我從一個函數生成。它不像一個正常的數組,因爲我的排序fxn var sort_arrays = function(a,b) {return a[0]-b[0]};未能正確排序數組值。

我試圖確保我有一個實際的數組,並且我沒有調用另一種排序方法。

因此:

console.log(arr_test.sort(sort_arrays)); 

給出:[[8,1],[30,2],[59,4],[79,0],[580,3]]

然而,在我的FXN調用此,

console.log(input_kde.sort(sort_arrays)); 

,得出:[...,[580, 0.002],[59,0.001]]

在試圖生成一些打印輸出,我在我的資源上撥打了.toString ult,並得到正確的排序輸出,這隻會鞏固我的困惑。

我試圖用parseFloat(a[0])明確類型鑄造無濟於事。

我還試圖以確認,這確實是一個數組:

console.log(typeof(input_kde)); //#> object 
console.log(input_kde.constructor); //#> function Array() { [native code] } 
console.log(input_kde instanceof Array); //#> true 

此外,input_kde [0]是一個數組,input_kde [0] [0]是一個數字

console.log(input_kde[0] instanceof Array); //#> true 
console.log(typeof(input_kde[0][0])); //#> number 

我錯過了什麼?

EDIT2

var input_kde = [[22,0.0017095221275204712],[24,0.001712291003699343],[28,0.001716821328044571],[307,0.0009792081392809542],[33,0.0017205981968323918],[34,0.0017211029300063302],[341,0.0010085669284820244],[35,0.0017215244128879188],[387,0.0010558490092862406],[4,0.0016696065108796395],[40,0.0017223891946762664],[448,0.0010667514507313397],[491,0.0010124434821844265],[519,0.0009480280002363708],[580,0.0007465298453339767],[59,0.0017073128314605394]] 
+1

其他事情要確認:(1)'input_kde [0]'是一個數組。 (2)'sort_arrays'實際上被調用。 (對於調試,你可以臨時添加一些像if(!window.foo){console。日誌(「調用sort_arrays」); } window.foo = true;'這樣它就會在第一次調用時記錄日誌。)(3)'input_kde [0] [0]'是一個字符串。 – ruakh 2012-07-23 20:29:18

+0

@ruakh(2)'sort_arrays'被調用,因爲.toString不會給出正確的答案,我在arr_test的情況下使用sort_arrays。 – Ryanmt 2012-07-23 20:31:55

+0

那麼......將結果賦值給值似乎會使其工作。否則它返回一個未排序的數組。 – Ryanmt 2012-07-23 22:24:14

回答

0

我可能只是在這裏的黑暗中拍攝,但你卻在那裏(字符串和INT)混合型?

0

它似乎做工精細http://jsfiddle.net/w8T32/

var test_arr = [['79',0],['8',1],['30', 2],['580',3],['59',4]]; 
test_arr.sort(function(a,b){ 
    return a[0] -b[0]; 
}); 
console.log(test_arr)​ 

和輸出是一樣的東西

[['8',1], ['30',2], ['59', 4], ['79',0], ['580', 3]] 

有一點要考慮的是那種沒有成文的返回值(它會修改數組地方),但你似乎正在使用它。改變你的代碼,所以它不依賴於返回值,看看是否有任何區別

+0

同意。我的測試用例確實有效。這並不令人意外。 – Ryanmt 2012-07-23 20:44:41

+0

@Ryanmt你的評論是什麼意思?你同意並將改善你的問題?如果這不是一個驚喜,你爲什麼使用它?你只是在浪費人們試圖在這裏幫助你的時間,因爲沒有在你的問題中付出足夠的努力 – 2012-07-23 20:45:28

+0

我的測試用例數組確實有效。我已經證明了上述情況,我遇到的問題是實際數據,就像在input_kde中一樣。 – Ryanmt 2012-07-23 20:50:11

0
 
var input_kde = [[22,0.0017095221275204712],[24,0.001712291003699343],[28,0.001716821328044571],[307,0.0009792081392809542],[33,0.0017205981968323918],[34,0.0017211029300063302],[341,0.0010085669284820244],[35,0.0017215244128879188],[387,0.0010558490092862406],[4,0.0016696065108796395],[40,0.0017223891946762664],[448,0.0010667514507313397],[491,0.0010124434821844265],[519,0.0009480280002363708],[580,0.0007465298453339767],[59,0.0017073128314605394]] 



    //test run 
    var sorted=input_kde.sort(function(a,b){return a[0]-b[0]}); 
    alert(sorted); 

我找不到任何錯誤!

實際上,爲什麼你的代碼在第二次運行中無法返回正確的值是因爲你已經將變量sort_arrays設置爲前一個!因此,失敗!

+0

顯然,我永遠不會理解Javascript。我在哪裏分配了sort_arrays的東西? – Ryanmt 2012-07-23 22:23:11

+0

如果你想讓它工作,修改你的代碼 - 函數sort_arrays(a,b){return a [0] -b [0]};現在evrything應該可以正常工作,例如: - var sorted = input_kde.sort(sort_arrays); alert(sorted); var sorted2 = test_arr.sort(sort_arrays); alert(sorted2); – spaceman12 2012-07-23 22:50:20

+0

爲什麼你的第一個代碼無法工作sort_arrays = function(a,b){return a [0] -b [0]}在你用第一個數組運行時已經有一些值了,也就是test_arr和所以它和以前不一樣了! – spaceman12 2012-07-23 22:54:23