2013-09-03 2 views
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/" 
    } 
] 

В основном это сортировка на верхний элемент массива, где экономия является строкой. Я хочу их внизу.

+2

То массив объектов, а не строка Json – andrew

+1

Почему с помощью 'а [0] .Saving', а не' a.Saving'? – 6502

+1

Я отредактировал ваш вопрос, чтобы удалить ссылки на JSON, поскольку он не имеет никакого отношения к нему. Не стесняйтесь исправить, если я ошибаюсь. –

ответ

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 Почему бы не классический 'return b - a'? Есть ли что-то другое в JS? – xanatos

+0

@xanatos Слишком легко; хорошо, позвольте мне исправить это ** изменить ** исправлено –

+0

Я спросил, потому что никогда не может знать со слабыми типизированными языками, такими как JS ...возможно, было что-то скрытое (например, ваше использование ===, но, по крайней мере, я знаю) – xanatos

0

Когда функция компаратора поставляется с Array.prototype.sort, ей заданы аргументы a и b, которые являются элементами исходного массива, а не самим массивом.

Итак, в этом конкретном случае вам необходимо сбросить [0]. Например, вместо:

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

попробовать:

if (a.Saving === b.Saving) { ... 
      // ^-- also, it's best to use strict comparison 
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, а parseFloat(null) === NaN (что тогда я могу обработать).

+0

И будем надеяться, что' a' и 'b' не' null';) – Oleg

+0

@Oleg + null - 0 ... mmmmh – xanatos

+0

'+ null.Saving' ->" TypeError : Невозможно прочитать свойство «Сохранение» нулевого значения, потому что свойство будет считано перед попыткой «отличить» от числа. – Oleg

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 
} 
Смежные вопросы