我有一个像这样的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的内置排序功能并创建我自己的比较?答案 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);
答案 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; }