2017-01-18 43 views
1

數組我有一個Javascript數組是這樣的:使用lodash排序對象上浮點數

var list = [{Name: 'X', Value: 140.000}, 
{Name: 'Y', Value: 200.000}, 
{Name: 'Z', Value: 50.000}] 

(它有很多屬性,但已爲簡潔起見省略)。

我已經創建了一個函數,使用傳遞給函數的屬性的名稱對此列表進行排序。我用lodash很容易做到這一點,但如果我按價值排序,這些值似乎被視爲一個字符串並且排序錯誤。

這是我的排序功能(到目前爲止)

function sortByField(fieldName) 
    { 
     list = _.sortBy(list, fieldName); 

     //afterwards I call reverse() if the sortDirection is descending, but I omitted this part for brevity 
    } 

價值排序後,我得到了下面的數組:

var list = [{Name: 'X', Value: 140.000}, 
{Name: 'Y', Value: 200.000}, 
{Name: 'Z', Value: 50.000}] 

你可以看到治療的價值,例如字符串,即使他們是十進制數。 'Z'對象應該是第一個。我該如何解決這個問題?

我一直在搜索lodash文檔,但似乎無法找到任何與此問題有關的東西。請幫忙嗎?這將非常感激。

編輯:我只是意識到價值屬性是通過網頁(輸入控件)填寫,所以JavaScript實際上將它作爲字符串添加到數組中,這可能會導致問題。我可以以某種方式將此投射到一個浮動?或者我不得不求助於JavaScript的內置排序功能,並創建我自己的比較?

+2

只需使用簡單的內置的JavaScript'的.sort()'有回調返回兩個「值」屬性之間的區別。 – Pointy

+0

爲什麼小數點後的位置? –

+0

哦,這是一個數千分隔符,而不是示例中的小數點。在我的國家,「。」是一個數千分隔符:-) –

回答

2

你貼什麼:

var list = [{Name: 'X', Value: 140.000}, 
    {Name: 'Y', Value: 200.000}, 
    {Name: 'Z', Value: 50.000}]; 

list = _.sortBy(list, 'Value'); 
console.log(list); 

應該按預期工作。

http://jsbin.com/fegifibasu/edit?js,console

現在,如果由於某種原因(如你所提到的),值字段包含字符串,而不是浮動,那麼你就需要編寫你的「自定義」排序功能。例如:

var list = [{Name: 'X', Value: '140.000'}, 
    {Name: 'Y', Value: '200.000'}, 
    {Name: 'Z', Value: '50.000'}]; 

list = _.sortBy(list, function(o) { 
    return parseFloat(o.Value); 
}); 
console.log(list); 

http://jsbin.com/gagelipuza/edit?js,console

0

你可以使用Array#sort用自定義compareFunction和替換像'.'''和可能的小數點分隔','帶點不想要的字符。

var list = [{ Name: 'X', Value: '140.000' }, { Name: 'Y', Value: '200.000' }, { Name: 'Z', Value: '50.000' }]; 
 

 
list.sort(function (a, b) { 
 
    function getValue(v) { 
 
     return parseFloat(v.replace('.', '').replace(',', '.')); 
 
    } 
 
    return getValue(a.Value) - getValue(b.Value); 
 
}); 
 

 
console.log(list);
.as-console-wrapper { max-height: 100% !important; top: 0; }