0

我有以下数组:

[
    {
        "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

4 回答 4

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;
});
于 2013-09-03T12:17:27.700 回答
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将字符串转换为数字,但我已将其更改为parseFloat. null: +null === 0, while parseFloat(null) === NaN(然后我可以处理)有一个细微的区别。

于 2013-09-03T12:28:25.877 回答
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
}
于 2013-09-03T12:34:02.627 回答
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
于 2013-09-03T12:17:15.730 回答