Array Sort not working

匿名 (未验证) 提交于 2019-12-03 08:54:24

问题:

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;  }); 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!