2017-01-18 10 views
1

У меня есть массив Javascript так:Использование lodash для сортировки массива объектов на число с плавающей точкой

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

(он имеет гораздо больше свойств, но были опущены для краткости).

Я создал функцию, которая сортирует этот список, используя имя свойства, переданного в функцию. Я сделал это легко с lodash, но если я сортирую значение Value, значения, похоже, обрабатываются строками и неправильно сортируются.

Это моя-то функция (пока)

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}] 

Вы можете видеть, что обработал значение как строки, даже если они являются десятичными числами. «З-объект должен был быть первым. Как я могу это решить?

Я искал документацию lodash, но не мог найти ничего, связанного с этой проблемой. Любая помощь, пожалуйста? Это будет очень признательно.

EDIT: Я просто понял, что свойство Value заполнено через веб-страницу (элемент управления вводом), поэтому Javascript фактически добавляет его в массив как строку, что, вероятно, вызывает проблему. Могу ли я каким-то образом применить это к поплавке? Или мне нужно прибегнуть к встроенной функции сортировки Javascript и создать собственный Сравнить?

+2

Просто используйте равнину встроенный в JavaScript '.sort()' с обратного вызова, чтобы вернуть разницу между этими двумя свойствами «Значение». – Pointy

+0

Почему позиции после десятичной точки? –

+0

О, это тысяча-сеператор, а не десятичная точка в примере. В моей стране "." является тысячным seperator :-) –

ответ

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

Теперь, если по какой-то причине (как вы упомянули), поле Value содержит строку вместо поплавка, то вам нужно будет написать свою собственную «» функцию сортировки. Например:

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; }