2014-11-03 92 views
0

我有一個取值爲數組的變量,這些值是字母數字或數字,但是作爲字母數字,問題是根據值應用排序的最有效方式是什麼?我想按字母順序排序字母數字值和升序,當它包含數字時。基於數值的Javascript數組排序基於數值的數組排序

到目前爲止我知道

var myArr=['c','a','b'] 
myArr.sort(); //gives output a,b,c 

,如果以後:

myArr=['10','1','2']; 
myArr.sort();// gives 1,10,2 

但有決定排序基於陣列的內容使用哪種方法的快捷方式?

在此先感謝!

+0

你在找什麼? http://stackoverflow.com/questions/1063007/arr-sort-does-not-sort-integers-correctly – ius 2014-11-03 12:50:46

+1

是。'typeof myArr [0]'將返回''字符串'或'數字'。這與條件相結合可以準確地給出你需要的東西。 – 2014-11-03 12:50:56

+0

你有例如「ab」和「abc」你想先放哪一個(我的意思是你要求的字母字符的標準是什麼) – Ismail 2014-11-03 12:53:59

回答

0

要知道列表中的所有內容都是數字的唯一方法是觸摸列表中的所有內容。例如,您可以編寫一個函數來決定,如果一切是一個數字:

function hasOnlyNumbers(arr) { 
    var l = arr.length; 
    for (var i = 0; i < l; i++) { 
     if (isNaN(arr[i]) { 
      return false; 
     } 
    } 
    return true; 
} 

然後,你可以使用這個結果做你的排序。如果他們都爲數字,排序數字,否則按字母順序排序,現在可以實現:

if (hasOnlyNumbers(myArr)) { 
    myArr.sort(sortNumber); 
} else { 
    myArr.sort(); 
} 

由於任何非數字的項目意味着應該按照字母順序排序,這是一樣好,你可以做,因爲一旦發現不是數字的東西,hasOnlyNumbers函數就會返回。當然,你需要了解isNaN做什麼,因爲它可能會調用你是不是期待的東西數字(如25E7是一個完全有效的數量指數形式,並isNaN返回false)。

+0

當然,但我們可以開始寫'!arr.some(isNaN)'嗎? – 2014-11-03 13:08:46

+0

這不是JavaScript標準的一部分,也不是跨瀏覽器兼容的。 – Zach 2014-11-03 17:41:36

+0

一個了不起的,不正確的斷言。它是JavaScript標準的一部分,除非您指的是由IE <= 8實現的舊式ES3標準。如果您需要支持舊式瀏覽器,則可以使用多種填充方式,包括由es5-shim提供的填充方式,它也包含在Modernizr中,我假定你熟悉並使用它。 – 2014-11-03 18:03:56

1

但是,如果數組元素是一致的(總是數字字符串或總是非數字字符串),您可以測試其中一個,然後做出決定。

myArr.sort(/^\d+$/.test(myArr[0]) ? numericComparison : stringComparison); 

...其中stringComparison可能是:

function stringComparisons(a, b) { 
    return a.localeCompare(b); 

}

...和numericComparison會在你的問題來,如圖所示。

如果不一致的話,我不知道你比其他的選項預掃描該陣列看到你正在處理的是什麼,然後相應地排序,因爲你無法取消在中間排序操作,所以你不能假設一個,但切換到另一箇中途。

+0

檢查更新的問題..第二種情況是指數組,但在字符串的形式。我能爲這種情況做些什麼? – sstauross 2014-11-03 13:05:47

+0

@sstauross:檢查數字:'if(/^\d+$/.test(myArr[0]))...'我已經更新了答案以證明這一點。 – 2014-11-03 13:07:07

0

你可以在你的排序函數中構建邏輯。這個想法是兩個數字按數字順序排列,兩個字符串按字母順序排列,字符串按數字排序。

function sortfunc(a, b) { 
 
    if (isNaN(a)) { 
 
     if (isNaN(b)) { return a < b ? -1 : +1; } 
 
     else   { return    +1; } 
 
    } else { 
 
     if (isNaN(b)) { return    -1; } 
 
     else   { return +a < +b ? -1 : +1; } 
 
    } 
 
} 
 

 
document.writeln(['b', '1', '20', 'a', '10'].sort(sortfunc).join(' -- ')); 
 

或者,如果你願意,你可以preconvert:

function toNumber(n) { return isNaN(n) ? a : +a; } 

myArray 
    .map(toNumber) 
    .sort(function(a, b) { 
     return a < b ? -1 : +1; 
    });