基本上,我正在尝试sort an array of objects by property。
假设我在一个数组中有三个对象,每个对象都有一个属性views
var objs = [
{
views: '17'
},
{
views: '6'
},
{
views: '2'
}
];
在数组objs
上使用sort方法:
function sortByProperty(property) {
return function (a,b) {
/* Split over two lines for readability */
return (a[property] < b[property]) ? -1 :
(a[property] > b[property]) ? 1 : 0;
}
}
objs.sort(sortByProperty('views'));
我希望objs
现在基本上按相反的顺序排列,但'17'
似乎被视为小于'6'
和'2'
。我意识到这可能是因为'1'
。
有关解决此问题的任何想法?
我意识到我可以迭代每个对象并转换为整数 - 但有没有办法避免这样做?
JSFiddle:http://jsfiddle.net/CY2uM/
答案 0 :(得分:3)
Javascript是有点打字的语言; <
表示字符串的字母排序,数字的数字排序。唯一的方法是将值强制转换为数字。一元运算符+在这里有所帮助。因此,试试
function sortByNumericProperty(property) {
return function (a,b) {
var av = +a[property], bv = +b[property];
/* Split over two lines for readability */
return (av < bv) ? -1 :
(av > bv) ? 1 : 0;
}
}
但通常是常见的习语(also documented on MDN)
function sortByNumericProperty(property) {
return function (a,b) {
return a[property] - b[property];
}
}
也应该有效。
答案 1 :(得分:2)
如果可以将a[property]
和b[property]
解析为数字
function sortByProperty(property) {
return function (a,b) {
return a[property] - b[property];
}
}
答案 2 :(得分:0)
在使用之前,您可能必须将值转换为整数 -
function sortByProperty(property) {
return function (a,b) {
var x = parseInt(a[property]);
var y = parseInt(b[property])
/* Split over two lines for readability */
return (x < y) ? -1 : (x > y) ? 1 : 0;
}
}