3

基本上,我正在尝试按 property 对一组对象进行排序

假设我在一个数组中有三个对象,每个对象都有一个属性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'and '2'。我意识到这可能是因为'1'.

关于解决这个问题的任何想法?

我意识到我可以遍历每个对象并转换为整数 - 但有没有办法避免这样做?

JSFiddle:http: //jsfiddle.net/CY2uM/

4

3 回答 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];
    }
}

也应该工作。

于 2013-08-18T17:00:29.657 回答
2

如果a[property]并且b[property]可以解析为数字

function sortByProperty(property) {
    return function (a,b) {
            return a[property] - b[property];
    }
}
于 2013-08-18T17:00:14.350 回答
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;
    }
}
于 2013-08-18T16:56:37.890 回答