数组排序不起作用

时间:2014-04-25 18:41:51

标签: javascript arrays sorting

我有一个对象数组,我试图排序但它似乎没有工作。数组中的某些对象具有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);

4 个答案:

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