使用属性对对象数组进行排序时,字符串出现错误

3
基本上,我正在尝试按属性排序对象数组
假设我有一个数组中的三个对象,每个对象都有一个属性views
var objs = [
    {
        views: '17'
    },
    {
        views: '6'
    },
    {
        views: '2'
    }
];

在数组objs上使用排序方法:

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/
3个回答

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

但通常是普遍习惯用语(也在 MDN 上有文档记录

function sortByNumericProperty(property) {
    return function (a,b) {
        return a[property] - b[property];
    }
}

应该也能工作。


从性能角度来看,您认为这样做与在数组上进行迭代并事先将每个属性转换为整数相比哪个更好? - ahren
在这种情况下,隐式转换也正在发生。 - Moazzam Khan
1
Ahren:这并不应该太重要,大多数情况下差异应该是可以忽略的。 - Antti Haapala -- Слава Україні

2
如果 a[property]b[property] 可以解析为数字。
function sortByProperty(property) {
    return function (a,b) {
            return a[property] - b[property];
    }
}

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

是的,我意识到我可以简单地使用 parseInt 处理所有内容 - 但这并不完全是我所希望的... - ahren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接