Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Array Sort not working

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": "[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);
like image 325
Mdd Avatar asked Dec 06 '22 02:12

Mdd


2 Answers

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;
});
like image 122
Jason Harwig Avatar answered Dec 22 '22 07:12

Jason Harwig


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;
});
like image 31
Barmar Avatar answered Dec 22 '22 07:12

Barmar