无法对对象数组进行排序

时间:2013-09-03 12:11:52

标签: javascript sorting

我有以下数组:

[
    {
        "BestCoupon": 1,
        "Saving": "100",
        "Successful": 1,
        "couponCode": "CRIC100",
        "description": "Get Rs. 100 Discount on purchase of Rs. 599 & above. Products include Eyeglasses & Sunglasses and more. Choose",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE :Coupon code \"CRIC200\" is not valid.",
        "Successful": 0,
        "couponCode": "CRIC200",
        "description": "Get Rs. 200 Discount on purchase of Rs. 999 & above. Products include Eyeglasses & Sunglasses and more. Choose",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"CRIC300\" is not valid.",
        "Successful": 0,
        "couponCode": "CRIC300",
        "description": "Get Rs. 300 Discount on purchase of Rs. 1199 & above. Products include Eyeglasses, Sunglasses & Contact Lenses",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE: Coupon code \"JJPREMIUM\" is not valid.",
        "Successful": 0,
        "couponCode": "JJPREMIUM",
        "description": "Get Rs 600 Discount on John Jacobs Eyeglasses. Products include Eyeglasses. Choose from brand like John",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE: Coupon code \"LENS20130303\" is not valid.",
        "Successful": 0,
        "couponCode": "LENS20130303",
        "description": "Get Rs. 500 Discount on purchase of Rs. 1000. Products include Eyeglasses, Sunglasses & Contact Lenses and",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "179.8",
        "Successful": 1,
        "couponCode": "LKEND20",
        "description": "Get 20% Discount on Eyeglasses. Minimum Purchase Rs. 499. Products include Eyeglasses. Choose from brandslike",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "224.75",
        "Successful": 1,
        "couponCode": "LKEND25",
        "description": "Flat 25% off on purchase of Rs 799 & above",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"LKEND30\" is not valid.",
        "Successful": 0,
        "couponCode": "LKEND30",
        "description": "Get 30% Discount on purchase of Rs 1299 & above. Products include Eyeglasses, Sunglasses & Contact Lenses and",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"LKEND35\" is not valid.",
        "Successful": 0,
        "couponCode": "LKEND35",
        "description": "Get 35% Discount on purchase of Rs 1499 & above. Products include Eyeglasses, Sunglasses & Contact Lenses and",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "100",
        "Successful": 1,
        "couponCode": "OMGABV600",
        "description": "Get Rs. 100 Discounton order of Rs. 600 & Above. Products include Eyeglasses, Sunglasses & Contact Lenses and",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"POWERSUN20\" isnot valid.",
        "Successful": 0,
        "couponCode": "POWERSUN20",
        "description": "Get 20% OFFon Power Sunglasses. Select from a vast collection.",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "179.8",
        "Successful": 1,
        "couponCode": "WEEKEND20",
        "description": "Flat 20% OFF on purchase of Rs 499 & above - NA on Premium Brands & Contact Lenses",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    }
]

我想按“储蓄”的降序排序。我使用以下代码

couponObj.sort(function (a, b) {
      if (a[0].Saving == b[0].Saving)
         return 0;
      if (a[0].Saving > b[0].Saving)
         return -1;
      if (a[0].Saving < b[0].Saving)
         return 1;
});

它给我以下结果:

[
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"POWERSUN20\" is not valid.",
        "Successful": 0,
        "couponCode": "POWERSUN20",
        "description": "Get 20% OFF on Power Sunglasses. Select from a vast collection.",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"LKEND35\" is not valid.",
        "Successful": 0,
        "couponCode": "LKEND35",
        "description": "Get 35% Discount on purchase of Rs 1499 & above. Products include Eyeglasses, Sunglasses & Contact Lenses and",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"LKEND30\" is not valid.",
        "Successful": 0,
        "couponCode": "LKEND30",
        "description": "Get 30% Discount on purchase of Rs 1299 & above. Products include Eyeglasses, Sunglasses & Contact Lenses and",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"LENS20130303\" is not valid.",
        "Successful": 0,
        "couponCode": "LENS20130303",
        "description": "Get Rs. 500 Discount on purchase of Rs. 1000. Products include Eyeglasses, Sunglasses & Contact Lenses and",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"JJPREMIUM\" is not valid.",
        "Successful": 0,
        "couponCode": "JJPREMIUM",
        "description": "Get Rs 600 Discount on John Jacobs Eyeglasses. Products include Eyeglasses. Choose from brand like John",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"CRIC300\" is not valid.",
        "Successful": 0,
        "couponCode": "CRIC300",
        "description": "Get Rs. 300 Discount on purchase of Rs. 1199 & above. Products include Eyeglasses, Sunglasses & Contact Lenses",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "NOT APPLICABLE : Coupon code \"CRIC200\" is not valid.",
        "Successful": 0,
        "couponCode": "CRIC200",
        "description": "Get Rs. 200 Discount on purchase of Rs. 999 &above. Products include Eyeglasses & Sunglasses and more. Choose",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "224.75",
        "Successful": 1,
        "couponCode": "LKEND25",
        "description": "Flat 25% off on purchase of Rs 799 & above",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "179.8",
        "Successful": 1,
        "couponCode": "LKEND20",
        "description": "Get 20% Discount on Eyeglasses. Minimum Purchase Rs. 499. Products include Eyeglasses. Choose from brands like",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "179.8",
        "Successful": 1,
        "couponCode": "WEEKEND20",
        "description": "Flat 20%OFF on purchase of Rs 499 & above - NA on Premium Brands & Contact Lenses",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "100",
        "Successful": 1,
        "couponCode": "CRIC100",
        "description": "Get Rs. 100 Discount on purchase of Rs. 599 & above. Products include Eyeglasses & Sunglasses and more. Choose",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    },
    {
        "BestCoupon": 0,
        "Saving": "100",
        "Successful": 1,
        "couponCode": "OMGABV600",
        "description": "Get Rs. 100 Discount on order of Rs. 600 & Above. Products include Eyeglasses, Sunglasses & Contact Lenses and",
        "domain": "www.lenskart.com",
        "url": "http://www.lenskart.com/checkout/cart/"
    }
]

基本上它在数组项的顶部排序,其中保存是一个字符串。我想把它们放在最底层。

4 个答案:

答案 0 :(得分:3)

您似乎正在尝试访问对象的属性0,该属性似乎不存在;并在纠正错误的同时,更容易看到发生了什么。

couponObj.sort(function (a, b) {
    a = +a.Saving, b = +b.Saving; // cast Number
    // special cases
    if (a !== a || b !== b)           // If there is a NaN
        return (a !== a) - (b !== b); // move it to the end
    // classic descending sort
    return b - a;
});

答案 1 :(得分:1)

正如其他人所建议的那样,但有一点需要注意:你有各种Saving文本而不是描述......

couponObj.sort(function (a, b) {
    a = parseFloat(a.Saving); // cast to number
    b = parseFloat(b.Saving); // cast to number

    if (isNaN(a)) return isNaN(b) ? 0 : 1;
    if (isNaN(b)) return -1;

    return b - a; // descending order
});

当您尝试将非数字转换为+的数字时,返回的数字为NaN(特殊值不能很好地排序)。出于这个原因,各种if (isNaN())

请注意,在初始版本中,我使用+a.Saving将字符串转换为数字,但我已将其更改为parseFloatnull+null === 0parseFloat(null) === NaN(我可以处理)之间存在细微差别。

答案 2 :(得分:0)

当比较器函数提供给Array.prototype.sort时,会给出参数ab,它们是原始数组的元素,而不是数组本身。

因此,在这种特殊情况下,您需要删除[0]。例如,而不是:

if (a[0].Saving == b[0].Saving) { ...

尝试:

if (a.Saving === b.Saving) { ...
           // ^-- also, it's best to use strict comparison

答案 3 :(得分:0)

使用parseFloat方法将字符串转换为浮点数:

couponObj.sort(function (a, b) {
  if(a && b) {
    var af = parseFloat(a.Saving);
    var bf = parseFloat(b.Saving);
    if(isNan(af)) return 1;
    if(isNan(bf)) return -1;
    return bf-af;
  }
  return 0; // ignore null entries
}