2013-09-01 32 views
4

我有一個字符串類型的整數數組。在jQuery中使用整數字符串類型對數組進行排序

var a = ['200','1','40','0','3']; 

輸出
>>> var a = ['200','1','40','0','3']; 
console.log(a.sort()); 
["0", "1", "200", "3", "40"] 

我也將有一個混合型陣列。例如

var c = ['200','1','40','apple','orange']; 

輸出
>>> var c = ['200','1','40','apple','orange']; console.log(c.sort()); 
["1", "200", "40", "apple", "orange"] 

=================================== ===============
字符串類型的整數獲得未排序。

+2

需要如何排序呢?數字先按數字順序排列,然後按字母順序排列? –

+0

那麼,你需要什麼? – thefourtheye

+0

@YuriyGalanter,數字然後按字母順序排列.... – beebek

回答

15

正如有人說,你可以寫你自己的比較函數:

var arr = ["200", "1", "40", "cat", "apple"] 
arr.sort(function(a,b) { 
    if (isNaN(a) || isNaN(b)) { 
    return a > b ? 1 : -1; 
    } 
    return a - b; 
}); 

// ["1", "40", "200", "apple", "cat"] 
+0

他補充說,我完成後:)只是更新了我的,但我喜歡你的一個班輪 –

+2

有趣的是'parseInt()'是不需要的(儘管它使事情更清晰):) – soulcheck

+0

@GrahamWalters是啊,我知道的問題不知何故;) – Kazuki

-1

據我所知,大多數JavaScript實現提供了一個函數,您可以通過它來提供自己的自定義排序。

Mozilla sort Method

5

這應該是你在找什麼

var c = ['200','1','40','cba','abc']; 
c.sort(function(a, b) { 
    if (isNaN(a) || isNaN(b)) { 
    if (a > b) return 1; 
    else return -1; 
    } 
    return a - b; 
}); 
// ["1", "40", "200", "abc", "cba"] 
+1

如果alpha不需要排序 –

+0

['parseFloat'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)不接受基數參數。更重要的是,請注意,只使用'-'運算符會將字符串轉換爲數字(也更快)。換句話說,只是'返回a-b'。 – Phrogz

+0

如果最後有另一個字符串類型的整數,則FAILS排序 var data = ['88','331','11','46','4445','200','a','300 「]; (a,b){ return parseFloat(a)-parseFloat(b); }) ); – beebek

1

你需要編寫自己的排序功能。

a.sort(function(a,b)) { 
    var intValA = parseInt(a, 10); 
    var intValB = parseInt(b, 10); 

    if (!isNaN(parseInt(a, 10))) && !isNaN(parseInt(b, 10)) { 
     // we have two integers 
     if (intValA > intValB) 
      return 1; 
     else if (intValA < intValB) 
      return 0; 
     return 1; 
    } 
    if (!isNaN(parseInt(a, 10)) && isNaN(parseInt(b, 10))) 
     return 1; 
    if (isNaN(parseInt(a, 10)) && !isNaN(parseInt(b, 10))) 
     return -1; 

    // a and b are not integers 
    if (a > b) 
     return 1; 
    if (a < b) 
     return -1; 
    return 0; 
}); 
+0

是否在parseInt之後應用IsNan將始終返回false? –

+1

你可以用三元運算符而不是這麼多的if語句冗長, '返回一個 b? 1:0' – Phrogz

+0

好點@Yuriy,謝謝。我編輯了我的答案。 – Tap

0

感謝所有,雖然我不知道jQuery的不多,但是從你們的例子,我總結如下代碼其中工程按我的要求

在螢火使用

var data = ['10','2', 'apple', 'c' ,'1', '200', 'a'], temp; 
temp = data.sort(function(a,b) { 
     var an = +a; 
     var bn = +b; 

     if (!isNaN(an) && !isNaN(bn)) { 
      return an - bn; 
     } 
     return a<b ? -1 : a>b ? 1 : 0; 
    }) ; 
alert(temp); 
+1

只是你現在'+ a'強制爲一個整數,如果可以的話,否則返回'NaN'。如果(isNaN(a)|| isNaN(b)){ 返回a>b≥1:-1; },則可以使用最短的一個:arr.sort(函數(a,b) 返回a -b; });' – soulcheck

+1

@soulcheck'+ a'強制爲數字,而不是「整數」。 – Phrogz

+0

@Progrog正確! – soulcheck

相關問題