2014-04-25 74 views
4

我有一个对象数组,我试图排序,但它似乎并没有工作。数组中的某些对象具有我要对其进行排序的orderNum属性。但并不是所有的对象都有这个属性。数组排序不工作

我希望将具有orderNum属性的对象排序到数组的顶部位置。

这里是一个小提琴是我曾尝试:http://jsfiddle.net/7D8sN/

这里是我的javascript:

var data = { 
    "attributes": [ 
    { 
     "value": "123-456-7890", 
     "name": "phone" 
    }, 
    { 
     "value": "[email protected]", 
     "name": "email" 
    }, 
    { 
     "value": "Gotham", 
     "name": "city", 
     "orderNum": 1 
    }, 
    { 
     "value": "12", 
     "name": "ID" 
    }, 
    { 
     "value": "Batman", 
     "name": "Super Hero", 
     "orderNum": 2 
    } 
    ] 
}; 

data.attributes.sort(function (a, b) { 
    if (a.orderNum < b.orderNum) { 
    return -1; 
    } 
    if (a.orderNum > b.orderNum) { 
    return 1; 
    } 

    return 0; 
}); 

console.log(data); 
+2

为我工作。 orderNum对于未定义的值应该有一个值。你得到的结果很奇怪,因为你正在比较未定义,而你的排序函数返回0时,你将值与没有值的值进行比较。 – jeremy

+0

@jeremy这是他的问题的整个观点,他想知道如何避免为没有orderNum的元素得到奇怪的结果。 – Barmar

回答

8

检查你的排序功能存在的属性。

data.attributes.sort(function (a, b) { 
    if ((typeof b.orderNum === 'undefined' && typeof a.orderNum !== 'undefined') || a.orderNum < b.orderNum) { 
     return -1; 
    } 
    if ((typeof a.orderNum === 'undefined' && typeof b.orderNum !== 'undefined') || a.orderNum > b.orderNum) { 
     return 1; 
    } 

    return 0; 
}); 
+0

这是完美的!我知道排序不确定,但我不确定该怎么做。谢谢! – Mdd

3

您必须特别检查属性undefined。否则,这两项测试都将返回false,因此您需要回到return 0,并将其视为等于一切。

data.attributes.sort(function (a, b) { 
    if (a.orderNum === undefined || a.orderNum < b.orderNum) { 
    return -1; 
    } 
    if (b.orderNum === undefined || b.orderNum < a.orderNum) { 
    return 1; 
    } 

    return 0; 
}); 
+0

谢谢!我看到没有orderNum的对象是未定义的,但却无法想象如何处理它。谢谢你这么好的解释! – Mdd

2

您可以检查每一个对象是否具有hasOwnProperty("orderNum")的属性,然后相应地对它们进行排序。如果一个人拥有了它,另一个没有,那么那个拥有它的人就会被放在第一位。我假定你正在用orderNum升序排序。

的jsfiddle:http://jsfiddle.net/dshell/RFr5N/

data.attributes.sort(function (a, b) { 
    if ((a.hasOwnProperty("orderNum")) && (b.hasOwnProperty("orderNum"))) 
    { 
     return a.orderNum - b.orderNum; 
    } 
    else if (a.hasOwnProperty("orderNum")) 
    { 
     return -1; 
    } 
    else if (b.hasOwnProperty("orderNum")) 
    { 
     return 1; 
    } 

    return 0; 
}); 
0

你需要的是 '正常化' 你输入:

data.attributes.sort(function (a, b) { 
    var aOrderNum = (a.orderNum === undefined) ? -1 : a.orderNum ; 
    var bOrderNum = (b.orderNum === undefined) ? -1 : b.orderNum ; 
    return aOrderNum - bOderNum; 
});