我有一个对象数组,我试图排序但它似乎没有工作。数组中的某些对象具有orderNum
属性,我将其定位为排序。但并非所有对象都具有此属性。
我希望将具有orderNum
属性的对象排序到数组中的顶部位置。
这是我尝试过的小提琴:http://jsfiddle.net/7D8sN/
这是我的javascript:
var data = {
"attributes": [
{
"value": "123-456-7890",
"name": "phone"
},
{
"value": "Something@something.com",
"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);
答案 0 :(得分:9)
检查排序功能中是否存在该属性。
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;
});
答案 1 :(得分: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;
});
答案 2 :(得分: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;
});
答案 3 :(得分:1)
您需要的是“规范化”您的输入:
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;
});