使用lodash对浮点数

时间:2017-01-18 15:39:45

标签: javascript sorting lodash

我有一个像这样的Javascript数组:

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

你可以看到它将值视为字符串,即使它们是十进制数字。 ' Z'对象应该是第一个。我该如何解决这个问题?

我一直在搜索lodash文档,但似乎无法找到与此问题相关的任何内容。有什么帮助吗?我们非常感激。

编辑:我刚刚意识到Value-property是通过网页(输入控件)填充的,所以Javascript实际上将它作为String添加到数组中,这可能会导致问题。我可以以某种方式将其投入浮动吗?或者我是否必须使用Javascript的内置排序功能并创建我自己的比较?

2 个答案:

答案 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

现在,如果由于某种原因(如您所述),Value字段包含字符串而不是float,那么您需要编写“自定义”排序函数。例如:

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

答案 1 :(得分:1)

您可以将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; }