可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have an array of objects that I am trying to sort but it does not seem to be working. Some objects in the array have a orderNum
property which I am targeting to sort. But not all objects have this property.
I want the objects with the orderNum
property to be sorted to the top positions in the array.
Here is a fiddle to what i have tried: http://jsfiddle.net/7D8sN/
Here is my 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);
回答1:
Check if the property exists in your sort function.
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; });
回答2:
You have to check specifically for the property being undefined
. Otherwise, both tests return false
, so you fall through to return 0
and treat them as equal to everything.
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; });
回答3:
You can check whether each object has the property with hasOwnProperty("orderNum")
and then sort them accordingly. If one has it, and the other does not, then the one with it gets put first. I made the assumption that you were sorting with orderNum ascending.
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; });
回答4:
What you need is to 'normalize' your input :
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; });