数组按字符串属性错误排序对象

时间:2013-08-18 16:54:55

标签: javascript arrays sorting

基本上,我正在尝试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/

3 个答案:

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