Как отсортировать массив по названию и колиству?

Есть массив:

let list = [
        { name: 'Samsung', count: 0 },
        { name: 'Apple', count: 0 },
        { name: 'Apple apple', count: 123},
        { name: 'Xiaomi', count: 76 },
        { name: 'Realme', count: 31 },
        { name: 'Vivo', count: 2 },
        { name: 'BQ', count: 1 },
        { name: 'Oukitel', count: 1 }
      ]

list.sort((a, b) => {
  if (a.name > b.name) {
      return 1
    } else if (a.name < b.name) {
      return -1
    } else {
      return 0
    }
})
  

console.log(list)

Как я могу отсортировать его к такому виду?:

 [
      { name: 'Apple apple', count: 123 },
      { name: 'BQ', count: 1 },
      { name: 'Oukitel', count: 1 },
      { name: 'Realme', count: 31 },
      { name: 'Vivo', count: 2 },
      { name: 'Xiaomi', count: 76 },
      { name: 'Apple', count: 0 },
      { name: 'Samsung', count: 0 }
 ]

Сначала сортируем по названию, у которых count > 0, а потом у которых count === 0


Ответы (2 шт):

Автор решения: Pavel Nazarian

Разбиваем на два массива через метод filter, сортируем и объединяем.

 let list = [
        { name: 'Samsung', count: 0 },
        { name: 'Apple', count: 0 },
        { name: 'Apple apple', count: 123},
        { name: 'Xiaomi', count: 76 },
        { name: 'Realme', count: 31 },
        { name: 'Vivo', count: 2 },
        { name: 'BQ', count: 1 },
        { name: 'Oukitel', count: 1 }
      ]

let arr1 = list.filter(el => el.count > 0 ).sort((a,b) => {
  if (a.name < b.name) return -1;
  if (a.name > b.name) return 1; 
  return 0; 
})

let arr2 = list.filter(el => el.count === 0 ).sort((a,b) => {
  if (a.name < b.name) return -1;
  if (a.name > b.name) return 1;
  return 0; 
})

let result = [...arr1,...arr2];
console.log(result);

→ Ссылка
Автор решения: Grundy

Можно обойтись одним методом .sort

Для этого надо определить критерии сортировки:

Сначала сортируем по названию, у которых count > 0, а потом у которых count === 0

Из постановки задачи следует

  1. если count у обоих сравниваемых элементов равен 0 - сравнивать по name
  2. если count у обоих сравниваемых элементов НЕ равен 0 - сравнивать по name
  3. в противном случае, больше тот, у кого count != 0

let list = [{
    name: 'Samsung',
    count: 0
  },
  {
    name: 'Apple',
    count: 0
  },
  {
    name: 'Apple apple',
    count: 123
  },
  {
    name: 'Xiaomi',
    count: 76
  },
  {
    name: 'Realme',
    count: 31
  },
  {
    name: 'Vivo',
    count: 2
  },
  {
    name: 'BQ',
    count: 1
  },
  {
    name: 'Oukitel',
    count: 1
  }
]

console.log(list.sort((a, b) => {
  // если count у обоих либо 0 либо не 0
  if ((a.count == 0 && b.count == 0) ||
    (a.count != 0 && b.count != 0)) return a.name > b.name ? 1 : a.name < b.name ? -1 : 0;

  // если count=0 у первого
  if (a.count == 0) return 1;

  // если count=0 у второго
  return -1;
}))

→ Ссылка