Как отсортировать массив по названию и колиству?
Есть массив:
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
Из постановки задачи следует
- если
countу обоих сравниваемых элементов равен 0 - сравнивать по name - если
countу обоих сравниваемых элементов НЕ равен 0 - сравнивать по name - в противном случае, больше тот, у кого 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;
}))