[英]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.