2016-04-18 4 views
1

Может кто-нибудь помочь мне с Array.sort()? Я могу сортировать по одному значению (например, return a < b), но не с большим количеством значений. Мне нужен этот случай, когда некоторые первичные значения имеют одинаковый результат.JavaScript Array.sort() с несколькими ключами

E.g. Массив:

var data = [ 
     { 
      "name": "Paolos Pizza", 
      "rating_count": 20, 
      "rating_value": 5, 
      "price": 7 
     }, 

     { 
      "name": "Bella Italia", 
      "rating_count": 55, 
      "rating_value": 3, 
      "price": 7 
     }, 

     { 
      "name": "Mama Mia", 
      "rating_count": 2, 
      "rating_value": 5, 
      "price": 99 
     }, 

     { 
      "name": "Mario's" , 
      "rating_count": 23, 
      "rating_value": 6, 
      "price": 7 
     }, 

     { 
      "name": "Colazione e Roma" , 
      "rating_count": 52, 
      "rating_value": 4, 
      "price": 7 
     } 

    ]; 

Прежде всего я хочу, чтобы отсортировать массив по убыванию по ключевому price. Если некоторые записи имеют одинаковую цену, я хочу сортировать ее по возрастанию в зависимости от rating_value. Если некоторые записи имеют одинаковые price и те же rating_value, то я хочу сортировать по возрастанию на rating_count.

Как я могу это решить?

ответ

1

Вы можете цепи и сравнение детали с logical OR|| и взять разницу в качестве результата для обратного вызова sort заказа.

var array = [{ "name": "Paolos Pizza", "rating_count": 20, "rating_value": 5, "price": 7 }, { "name": "Bella Italia", "rating_count": 55, "rating_value": 3, "price": 7 }, { "name": "Mama Mia", "rating_count": 2, "rating_value": 5, "price": 99 }, { "name": "Mario's", "rating_count": 23, "rating_value": 6, "price": 7 }, { "name": "Colazione e Roma", "rating_count": 52, "rating_value": 4, "price": 7 }]; 
 

 
array.sort(function (a, b) { 
 
    return b.price - a.price || 
 
     a.rating_value - b.rating_value || 
 
     a.rating_count - b.rating_count; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

1

Это ваше решение:

arr.sort(function(a,b) { 
    if(a.price != b.price) return a.price < b.price; 
    if(a.rating_value != b.rating_value) return a.rating_value < b.rating_value; 
    return a.rating_count < b.rating_count; 
}); 

Вы можете сделать направление сортировки соответственно ..

+0

Вы пробовали это? это не работает – murli2308

Смежные вопросы