Сортировка массива по категориям и именам в порядке возрастания

#javascript #sorting

#javascript #сортировка

Вопрос:

 var productMaster = [
    {id:'A441', name:'Pepsi',category:'Soft Drink', price:15, quantity:2},
    {id:'B234', name:'Coke', category:'Soft Drink', price:10, quantity:8},
    {id:'A617', name:'Mirinda', category:'Soft Drink', price:20, quantity:20},
    {id:'B003', name:'Sprite', category:'Soft Drink', price:16, quantity:5},
    {id:'B225', name:'Minute Maid', category:'Soft Drink', price:25, quantity:12},
    {id:'A742', name:'5Star', category:'Chocloate', price:10, quantity:3},
    {id:'B388', name:'Appy', category:'Soft Drink', price:35, quantity:9},
    {id:'A899', name:'Gems', category:'Chocloate', price:12, quantity:11},
    {id:'B635', name:'KitKat', category:'Chocloate', price:15, quantity:7},
    {id:'B408', name:'Perk', category:'Chocloate', price:8, quantity:15},
    {id:'A354', name:'Dairy Milk', category:'Chocloate', price:30, quantity:4}
]

productMaster.sort(compareName);
console.log(JSON.stringify(productMaster));

function compareName(prod1, prod2) {
   if (prod1.name > prod2.name)
        return 1;
   if (prod1.name == prod2.name)
        return 0;
   if (prod1.name < prod2.name)
        return -1;
}
  

Я отсортировал этот массив по имени в порядке возрастания.Но я не знаю, как отсортировать его, чтобы продукты в одной категории сортировались по названию.
Таким образом, на выходе должны быть продукты с категорией Шоколад, за которыми следуют продукты с категорией Безалкогольный напиток.

Комментарии:

1. Сортировка массива объектов на основе нескольких переменных экземпляра в javascript. Пожалуйста, выполните поиск в Google для этого

Ответ №1:

Вы можете сравнить category значения, сначала возвращая результат сравнения, если они не совпадают. Если категории совпадают, сравните имя и верните результат сравнения имен.

И сначала он будет отсортирован по категориям, а в той же категории он будет отсортирован по имени.

А для сравнения строк вы можете использовать String.prototype.localeCompare .

 var productMaster = [
  { id: 'A441', name: 'Pepsi', category: 'Soft Drink', price: 15, quantity: 2 },
  { id: 'B234', name: 'Coke', category: 'Soft Drink', price: 10, quantity: 8 },
  { id: 'A617', name: 'Mirinda', category: 'Soft Drink', price: 20, quantity: 20 },
  { id: 'B003', name: 'Sprite', category: 'Soft Drink', price: 16, quantity: 5 },
  { id: 'B225', name: 'Minute Maid', category: 'Soft Drink', price: 25, quantity: 12 },
  { id: 'A742', name: '5Star', category: 'Chocloate', price: 10, quantity: 3 },
  { id: 'B388', name: 'Appy', category: 'Soft Drink', price: 35, quantity: 9 },
  { id: 'A899', name: 'Gems', category: 'Chocloate', price: 12, quantity: 11 },
  { id: 'B635', name: 'KitKat', category: 'Chocloate', price: 15, quantity: 7 },
  { id: 'B408', name: 'Perk', category: 'Chocloate', price: 8, quantity: 15 },
  { id: 'A354', name: 'Dairy Milk', category: 'Chocloate', price: 30, quantity: 4 }
];

console.log(productMaster.sort(compareName));

function compareName(prod1, prod2) {
  const categoryCompare = prod1.category.localeCompare(prod2.category);
  return categoryCompare === 0 ? prod1.name.localeCompare(prod2.name) : categoryCompare;
}