У меня есть массив objectds, и мне нужно отсортировать по 3 полям даты (date1, date2, date3)
- Первая сортировка по дате1 по возрастанию
- , если есть больше документов ста же дата1 сортировка по дате3 по возрастанию
- (документы с нулевой или неопределенной датой1 должны быть последними)
- , если дата1 не определена, или нулевая сортировка по дате2 по возрастанию,
- , если есть большедокументы с одинаковой датой2 сортировать по дате3 по возрастанию
Допустим, у меня есть этот массив:
[
{ date1: null, date2: '20120-01-08', date3: '20120-01-06' },
{ date1: null, date2: '20120-01-09', date3: '20120-01-05' },
{ date1: null, date2: '20120-01-08', date3: '20120-01-05' },
{ date1: '20120-01-05', date2: '20120-01-07', date3: '20120-01-01' },
{ date1: '20120-01-04', date2: '20120-01-07', date3: '20120-01-02' },
{ date1: '20120-01-04', date2: '20120-01-10', date3: '20120-01-01' }
]
Мне нужно получить это:
[
{ date1: '20120-01-04', date2: '20120-01-10', date3: '20120-01-01' },
{ date1: '20120-01-04', date2: '20120-01-07', date3: '20120-01-02' },
{ date1: '20120-01-05', date2: '20120-01-07', date3: '20120-01-01' },
{ date1: null, date2: '20120-01-08', date3: '20120-01-05' },
{ date1: null, date2: '20120-01-08', date3: '20120-01-06' },
{ date1: null, date2: '20120-01-09', date3: '20120-01-05' }
]
Я пыталсяс помощью array.sort () и сумел решить самые подходящие 3 требования:
- первая сортировка по дате1 по возрастанию
- , если есть больше документов с той же датой1 сортировка по дате3 по возрастанию
- (документы с нулевой или неопределенной датой1 должны быть последними)
с использованием этой функции сортировки:
var array = [
{ date2: "20120-01-08", date3: "20120-01-06" },
{ date2: "20120-01-09", date3: "20120-01-05" },
{ date2: "20120-01-08", date3: "20120-01-05" },
{ date1: "20120-01-05", date2: "20120-01-07", date3: "20120-01-01" },
{ date1: "20120-01-04", date2: "20120-01-07", date3: "20120-01-02" },
{ date1: "20120-01-04", date2: "20120-01-10", date3: "20120-01-01" }
];
var result = array.sort(function(obj1, obj2) {
if (!obj1.date1 || !obj2.date1) {
return -1;
} else {
if (obj1.date1 > obj2.date1) return 1;
if (obj1.date1 < obj2.date1) return -1;
if (obj1.data3 > obj2.data3) return 1;
if (obj1.date3 < obj2.date3) return -1;
return 0;
}
});
Я получаю это:
0: {date1: "20120-01-04", date2: "20120-01-10", date3: "20120-01-01"}
1: {date1: "20120-01-04", date2: "20120-01-07", date3: "20120-01-02"}
2: {date1: "20120-01-05", date2: "20120-01-07", date3: "20120-01-01"}
3: {date2: "20120-01-08", date3: "20120-01-05"}
4: {date2: "20120-01-09", date3: "20120-01-05"}
5: {date2: "20120-01-08", date3: "20120-01-06"}
Я не уверен, как решить эти 2:
если дата1 не определена или сортировка по нулю по дате2 по возрастанию, , если есть больше документов с той же датой2, сортировка по дате3 по возрастанию
записи с неопределенной датой1 не сортируются...
https://codepen.io/wyzix33/pen/agaKRp
Спасибо