2015-10-19 39 views
1

我正在使用this solution對對象數組進行排序。這是功能:使用逗號分隔的價格字符串按數字順序排列對象數組

function sortJsonArrayByProperty(objArray, prop, direction){ 
    if (arguments.length<2) throw new Error("sortJsonArrayByProp requires 2 arguments"); 
    var direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending 
    if (objArray && objArray.constructor===Array){ 
     var propPath = (prop.constructor===Array) ? prop : prop.split("."); 
     objArray.sort(function(a,b){ 
      for (var p in propPath){ 
       if (a[propPath[p]] && b[propPath[p]]){ 
        a = a[propPath[p]]; 
        b = b[propPath[p]]; 
       } 
      } 
      // convert numeric strings to integers 
      a = a.match(/^\d+$/) ? +a : a; 
      b = b.match(/^\d+$/) ? +b : b; 
      return ((a < b) ? -1*direct : ((a > b) ? 1*direct : 0)); 
     }); 
    } 
} 

這是一個很好的解決方案。

但是我有一個列一個問題,即存儲價格格式爲:

 
950,75 
1234,99 
500,00 

所以,我有一個逗號分隔小數值。 然後,不是這個順序:

 
222,55 
550,00 
2000,99 
3000,00 

我越來越:

 
2000,99 
222,55 
3000,00 
550,00 

我想在做這部分做一些修改:

a = a.match(/^\d+$/) ? +a : a; 
b = b.match(/^\d+$/) ? +b : b; 

但是,這ISN」不工作。怎麼了?

+0

有沒有這樣的事,作爲一個 「JSON對象」。 JSON是JavaScript對象的有限字符串序列化。 – Touffy

+0

您正在排序的內容不是JSON對象。這是一個包含JavaScript對象的JavaScript數組。 JSON是用於數據交換的*文本符號。如果你正在編寫代碼,並且你沒有處理*字符串*,那麼你並沒有處理JSON。 –

+0

爲什麼不用''替換逗號',',''並且這樣做? –

回答

0

在JavaScript中,小數點分隔符始終.,從來沒有,因爲它是在一定的語言環境。因此,要使用,爲十進制爲JavaScript數字數字字符串轉換,你這樣做:

theNumber = +theString.replace(/\./g, '').replace(/,/g, '.'); 

theNumber = parseFloat(theString.replace(/\./g, '').replace(/,/g, '.')); 

...這取決於你是否要忽略尾隨無效字符(+沒有按't,parseFloat確實)。

這樣建議:​​

aVal = +a.replace(/\./g, '').replace(/,/g, '.'); 
bVal = +b.replace(/\./g, '').replace(/,/g, '.'); 
if (!isNaN(aVal) && !isNaN(bVal)) { 
    a = aVal; 
    b = bVal; 
} 
+0

裏面「如果」我已經改變!isNaN(a)by!isNaN(aVal),它的工作完美。 我在這裏得到了你的邏輯。 感謝您的幫助! –

+0

@GustavoTarchiani:Doh!編輯錯誤,現在已修復。很高興這有幫助。 –

+1

別擔心!再次感謝! –

0

逗號不被JavaScript識別爲有效的litteral數字的一部分,因此您不能使用一元+或任何其他內置方法轉換爲數字。您需要用逗號替換逗號,然後強制爲號碼。

a = a.match(/^(\d+),(\d+)$/) ? +(a[1]+'.'+a[2]) : a; 
相關問題