2011-02-08 66 views
0

我有一個稱爲「結果」的二維數組。結果中的每個「行」數組都包含字符串值和整數值。我使用這個腳本通過在onclick事件的任何「列」到數組排序:用Javascript排序多維數組:整數

function sort_array(results, column, direction) { 
var sorted_results = results.sort(value); 
function value(a,b) { 
    a = a[column]; 
    b = b[column]; 
    return a == b ? 0 : (a < b ? -1*direction : 1*direction) 
    } 
} 

也能正常工作與字符串列。但它將字符串而不是數字視爲整數列。例如,如果「升序」或97,200,15,1000「降序」,值15,1000,200,97將被分類爲1000,15,200,97。

我已經仔細檢查了type的整數值,腳本知道它們是數字。我怎樣才能讓它像對待他們一樣?

回答

1

使a和b的類型成爲決定你的函數返回的比較的一部分。在這個過程中,你必須決定如何排序整數相對於字符串。

或者,你可以有一個比較函數,取值,並進行一個替換,用一串固定長度的數字替換每一串數字,前導零,然後進行字符串比較。這種方法的一個好處是,你可以對「a2」,「a9」,「a10」等等進行排序,這是人們普遍喜歡的。

0

你確定他們是數字嗎?你是怎麼檢查的?試試這個修改,迫使他們是數字以防萬一:

if (isNumberColumn(column)) { 
    a = +a; 
    b = +b; 
} 
0

我認爲你將不得不排序前進行一列在值的初步遍。爲什麼?那麼你需要事先知道(在排序之前,也就是說)是否所有的值都可以看作數字。如果可以的話,那麼「價值」功能可以轉換它們。否則,它應該將它們排序爲字符串。

0

你可以嘗試使自己的比較功能,一個適合您的需求。你可以定義你自己的比較字符串和整數的方法。例如:

function getDirection(a,b){ 
    if(typeof(a) == typeof(b)) 
     return a == b ? 0 : (a>b?1:-1); 
    a+="";b+=""; 
    if(a[0] == '-') 
     { 
      if(b[0] != '-') 
       return 1; 
     } 
    else 
     if(b[0] != '-') 
      return -1; 
    return a[0] == b[0] ? 0 : (a[0]>b[0]?1:-1); 
} 

希望它有幫助。

0

首先:sort是一個增變器,這意味着排序發生在適當的位置。因此,爲了避免意外consequeces,我會改變

var sorted_results = results.sort(value); 

var sorted_results = results.slice(0).sort(value); 

當然除非你希望它在的地方進行排序的,但隨後你需要什麼的sorted_results變量?

至於排序本身 - 整數排序似乎對我來說工作得很好,問題實際上是混合整數和字符串場景中的字符串,如他的示例所示:http://jsfiddle.net/QJ5fM/,它對以下數組進行了相當的排序不同:

[[16],[131],['aa'],['0hey'],[176],[100],['hey'],[1],[12]]; 
[['aa'],[16],[131],['0hey'],[176],[100],['hey'],[1],[12]]; 
[['aa'],['0hey'],[16],[131],[176],[100],['hey'],[1],[12]]; 

給在Chrome 9以下結果:

1,12,0hey,aa,hey,16,100,131,176 
1,12,0hey,16,100,131,176,aa,hey 
1,12,16,100,131,176,0hey,aa,hey 

在Firefox 3以下。6:

1,12,0hey,aa,hey,16,100,131,176 
1,12,0hey,hey,16,100,131,176,aa 
1,12,hey,16,100,131,176,0hey,aa 

,並在IE8下面:

0hey,aa,hey,1,12,16,100,131,176 
0hey,aa,hey,1,12,16,100,131,176 
0hey,aa,hey,1,12,16,100,131,176 

此處作爲一個驚喜,看來IE8具有唯一理智的,或至少保持一致,實現:P