У меня есть следующая структура данных:
var dates = [
{
id: '1',
date1: '2022-03-21T18:59:36.641Z',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '2',
date1: '2022-03-20T18:59:36.641Z',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '3',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '4',
date2: '2022-03-15T18:59:36.641Z',
}
];
var sorted = dates.sort(function(a,b) {
return (a.date1 > b.date1) ? 1 : -1
});
console.info({sorted});
Обратите внимание, что дата1 не всегда доступна, но требуется дата2. Я хотел бы сначала отсортировать по дате1, а затем по дате2. Я создал эту скрипку для тестирования, но до сих пор не понял: https://jsfiddle.net/y9sgpob8/4/
Пожалуйста, помогите мне понять, как получить результаты в следующем порядке:
[{
date1: "2022-03-20T18:59:36.641Z",
date2: "2022-03-17T18:59:36.641Z",
id: "2"
}, {
date1: "2022-03-21T18:59:36.641Z",
date2: "2022-03-17T18:59:36.641Z",
id: "1"
}, {
date2: "2022-03-15T18:59:36.641Z",
id: "4"
}, {
date2: "2022-03-17T18:59:36.641Z",
id: "3"
}]
Вам нужно отсортировать по
date1
date1
date2
Поскольку даты указаны в формате ISO, вы можете выполнить сравнение строк для сортировки.
const input=[{id:"1",date1:"2022-03-21T18:59:36.641Z",date2:"2022-03-17T18:59:36.641Z",},{id:"2",date1:"2022-03-20T18:59:36.641Z",date2:"2022-03-17T18:59:36.641Z",},{id:"3",date2:"2022-03-17T18:59:36.641Z",},{id:"4",date2:"2022-03-15T18:59:36.641Z",}];
input.sort((a,b) =>
( ('date1' in b) - ('date1' in a) )
|| (a.date1 ?? '').localeCompare(b.date1 ?? '')
|| a.date2.localeCompare(b.date2)
)
console.info(input)
Это самое простое решение, которое я видел. Проверка существования date1
и сравнение этого значения — вот чего мне не хватало. Благодарю вас!
Вы также можете разделить объекты, которые имеют только date2
, затем отсортировать и, наконец, объединить их. См. фрагмент ниже:
const dates = [
{
id: '1',
date1: '2022-03-21T18:59:36.641Z',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '2',
date1: '2022-03-20T18:59:36.641Z',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '3',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '4',
date2: '2022-03-15T18:59:36.641Z',
}
];
var array1 = [];
var array2 = [];
for (const date in dates) {
if (dates[date].date1) {
array1.push(dates[date]);
} else {
array2.push(dates[date]);
}
}
var sorted1 = array1.sort(function(a,b) {
return (a.date1 > b.date1) ? 1 : -1
});
var sorted2 = array2.sort(function(a,b) {
return (a.date2 > b.date2) ? 1 : -1
});
const sorted = sorted1.concat(sorted2);
console.info({sorted});
Это решение работает, и ему легко следовать. Там больше вычислений, чем в решении @adiga, но мне, вероятно, будет легче отлаживать! Спасибо за решение!
Все записи, не имеющие даты1, будут найдены в конце результата, верно? Если это так, вы можете разделить на 2 массива и объединить их.
const dates=[{id:"1",date1:"2022-03-21T18:59:36.641Z",date2:"2022-03-17T18:59:36.641Z",},{id:"2",date1:"2022-03-20T18:59:36.641Z",date2:"2022-03-17T18:59:36.641Z",},{id:"3",date2:"2022-03-17T18:59:36.641Z",},{id:"4",date2:"2022-03-15T18:59:36.641Z",}];
const timeStamp = value => new Date(value).valueOf()
const arrWithDate1 = dates
.filter(elem => elem.date1)
.sort((a, b) => (timeStamp(a.date1) - timeStamp(b.date1)))
const arrWithDate2 = dates
.filter(elem => !elem.date1)
.sort((a, b) => (timeStamp(a.date2) - timeStamp(b.date2)))
console.info([...arrWithDate1, ...arrWithDate2]);
Нет, порядок дат не гарантируется. Тем не менее, спасибо за это решение!