簡體   English   中英

使用JavaScript對多維數組進行排序:整數

[英]Sorting Multidimensional Array with Javascript: Integers

我有一個2D數組,稱為“結果”。 結果中的每個“行”數組都包含字符串和整數值。 我正在使用此腳本按onclick事件上的任何“列”對數組進行排序:

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)
    }
}

這對於帶有字符串的列很好用。 但是它將整數列視為字符串而不是數字。 例如,值15、1000、200、97如果“升序”將排序為1000、15、200、97,或者將97、200、15、1000“降序”排序。

我仔細檢查所有的typeof整數值,並且腳本知道他們的數字。 我該如何對待他們呢?

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

或者,您可以具有一個比較函數,該函數接受這些值,並執行替換操作,以固定長度的數字字符串替換每個數字字符串,並以前導零代替,然后進行字符串比較。 這種方法的好處是您可以對人們通常喜歡的東西進行排序,例如“ a2”,“ a9”,“ a10”等。

您確定他們是數字嗎? 你怎么檢查的? 嘗試進行此修改以強制將它們設為數字,以防萬一:

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

我認為您將需要在排序之前對列中的值進行初步傳遞。 為什么? 那么,您需要事先知道(在排序之前)是否所有值都可以視為數字。 如果可以,則“值”功能可以轉換它們。 否則,應將它們按字符串排序。

您可以嘗試建立自己的比較功能,以滿足您的需求。 您可以定義自己的將字符串與整數進行比較的方式。 例如:

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);
}

希望能幫助到你。

首先:sort是一個變量,這意味着排序發生在適當的位置。 因此,為了避免意外征服,我會更改

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM