Как отфильтровать массив по статусу и по дате?
Нужно как-то отфильтровать массив по дате и по статусу. То есть, если статус gold то показывать сверху и чем раньше дата тем выше. Сначала gold,silver,common. Или есть воможность сразу достать mongoose-ом из базы?
[
{
img: [],
date: '12/28/2020',
services: [],
_id: '5fe9aa527f6fad2a60e36083',
section: 'Детские товары',
subsection: 'Детские коляски',
type: 'Продажа',
region: 'Алтайский край',
city: 'Барнаул',
productPrice: '123',
priceAd: '0',
title: '321',
description: '2',
name: '',
phone: '',
mail: '',
status: 'common',
__v: 0
},
{
img: [],
date: '12/28/2020',
services: [
'shares',
'hots'
],
_id: '5fe9aac4649a500f644861bc',
section: 'Детские товары',
subsection: 'Детские коляски',
type: 'Продажа',
region: 'Алтайский край',
city: 'Барнаул',
productPrice: '123',
priceAd: '85',
title: 'кросы',
description: '2',
name: '',
phone: '',
mail: '',
status: 'silver',
__v: 0
},
{
img: [
'5fe999b40b26ea24e842365f'
],
date: '12/28/2020',
services: [
'shares',
'recommend'
],
_id: '5fe999d60b26ea24e8423660',
section: 'Аудио,Видео,ТВ,Фото',
subsection: 'Телевизоры, плазменные панели',
type: 'Покупка',
region: 'Алтайский край',
city: 'Барнаул',
productPrice: '123',
priceAd: '110',
title: 'Дом',
description: '123',
name: 'Игорь',
phone: '123',
mail: '321',
status: 'gold',
__v: 0
}
]
Ответы (2 шт):
Автор решения: Aziz Umarov
→ Ссылка
Как-то так хотели, по статусам? По дням добавляется дополнительное условие на сравнении
return aStatus - bStatus === 0? new Date(a.date) - new Date(b.date): aStatus - bStatus;
let data = [
{
img: [],
date: '12/30/2020',
services: [],
_id: '5fe9aa527f6fad2a60e36083',
section: 'Детские товары',
subsection: 'Детские коляски',
type: 'Продажа',
region: 'Алтайский край',
city: 'Барнаул',
productPrice: '123',
priceAd: '0',
title: '321',
description: '2',
name: '',
phone: '',
mail: '',
status: 'common',
__v: 0
},
{
img: [],
date: '12/28/2020',
services: [],
_id: '5fe9aa527f6fad2a60e36083',
section: 'Детские товары',
subsection: 'Детские коляски',
type: 'Продажа',
region: 'Алтайский край',
city: 'Барнаул',
productPrice: '123',
priceAd: '0',
title: '321',
description: '2',
name: '',
phone: '',
mail: '',
status: 'common',
__v: 0
},
{
img: [],
date: '12/28/2020',
services: [
'shares',
'hots'
],
_id: '5fe9aac4649a500f644861bc',
section: 'Детские товары',
subsection: 'Детские коляски',
type: 'Продажа',
region: 'Алтайский край',
city: 'Барнаул',
productPrice: '123',
priceAd: '85',
title: 'кросы',
description: '2',
name: '',
phone: '',
mail: '',
status: 'silver',
__v: 0
},
{
img: [
'5fe999b40b26ea24e842365f'
],
date: '12/28/2020',
services: [
'shares',
'recommend'
],
_id: '5fe999d60b26ea24e8423660',
section: 'Аудио,Видео,ТВ,Фото',
subsection: 'Телевизоры, плазменные панели',
type: 'Покупка',
region: 'Алтайский край',
city: 'Барнаул',
productPrice: '123',
priceAd: '110',
title: 'Дом',
description: '123',
name: 'Игорь',
phone: '123',
mail: '321',
status: 'gold',
__v: 0
}
];
let result = data.sort((a,b) => {
let aStatus = getStatus(a.status);
let bStatus = getStatus(b.status);
return aStatus - bStatus === 0? new Date(a.date) - new Date(b.date): aStatus - bStatus;;
});
function getStatus(status) {
switch (status) {
case "gold" : return 0;
case "silver": return 1;
case "common": return 2;
default: return 3;
}
}
console.log(result);
Автор решения: nörbörnën
→ Ссылка
Говорят, что проще досортировать выборку после её получения, чем выдумывать такую сортировку (gold,silver,common) в mongodb.
Так что сортируем в стиле js (с предвычислением ключей сортировки):
let data = [
{
date: '12/30/2020',
status: 'common',
},
{
date: '12/28/2020',
status: 'common',
},
{
date: '12/28/2020',
status: 'silver',
},
{
date: '12/28/2020',
status: 'gold',
}
];
const sortedStatuses = ['common', 'silver', 'gold'];
const sortedData = data.reduce(
(acc, item) => {
acc.push({
key1: sortedStatuses.indexOf(item.status),
key2: new Date(item.date),
item
});
return acc;
},
[]
)
.sort((a, b) => (b.key1 - a.key1) || (a.key2 - b.key2))
.map(({ item }) => item);
console.log(sortedData);