Как отфильтровать массив по статусу и по дате?

Нужно как-то отфильтровать массив по дате и по статусу. То есть, если статус 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);

→ Ссылка