Я пытаюсь найти логику в сортировке некоторых массивов, но после нескольких часов мозгового штурма это просто выше моих сил, и, возможно, у вас есть идея.
Допустим, у нас есть массив объектов. Объекты выглядят так:
let obj = {day:'2',month:'6',year:'1938' }
и массив будет выглядеть так
let array = [ {year:'1938, month:'6', day:'3'},{year:'1935', month:'5', day:'3'},{year:'1935, month:'', day:''}, {year:'1935', month:'5', day:''}, {year:'1934}, month:'3', day:''}, {year:'1934', month:'3', day:'15'}, {year:'1934}, month:'', day:''}];
и я хочу, чтобы отсортированный массив выглядел примерно так
let sortedArray = [{year:'1934}, month:'', day:''},{year:'1934}, month:'3', day:''},{year:'1934}, month:'3', day:'15'},{year:'1935, month:'', day:''},{year:'1935', month:'5', day:''},{year:'1935', month:'5', day:'3'},{year:'1938, month:'6', day:'3'}
Поля для года, месяца и дня не требуются, потому что в моем приложении, вероятно, кто-то знает приблизительный год, когда что-то произошло, и это не обязательно, но когда я показываю все объекты и хочу, чтобы они начинались со всех объектов, которые имеют только год (отсортировано), затем все объекты, у которых есть год и месяц (отсортированы по году и месяцу), а затем все объекты, у которых есть все 3. Но также отсортированы в хронологическом порядке. То, что я строю, — это временная шкала. Также вы не можете добавить только год и день, а год обязателен.
Я попытался создать 3 массива, которые: 1 содержит объекты только с годами, затем 1 содержит годы и месяцы и один со всеми тремя из них.
что-то вроде
let array = [ {year:'1938, month:'6', day:'3'},{year:'1935', month:'5', day:'3'}, {year:'1935, month:'', day:''}, {year:'1935', month:'5', day:''}, {year:'1934}, month:'3', day:''}, {year:'1934', month:'3', day:'15'}, {year:'1934}, month:'', day:''}];
let array1 = [];
let array2 = [];
let array3 = [];
array.forEach((element) => {
if (element.month === '' && element.day ==='')
array1.push(element)
if (element.month !== '' && element.day ==='')
array2.push(element)
if (element.month !== '' && element.day !=='')
array3.push(element)
});
// I sorted array1 because they hold the years;
array1.sort(function(a,b) {
if (Number(a.year)>Number(b.year)) return 1;
if (Number(a.year)<Number(b.year)) return -1;
return 0;
});
let currentYear;
let currentYearIndex;
for(let i = 0;i< array1.length; i++} {
if (array1[i] !== array1[i+1] {
currentYear = array[i].year;
currentYearPosition=i}
}
for(let j = 0;j< array2.length; j++} {
if (array2[j] === currentYear){}
}
и здесь моя логика умерла, потому что мне пришлось сделать еще один, если проверить, меньше или больше месяц, чем то, что у нас уже есть в первом массиве, но мы этого не сделали в начале. Я не знаю, пытался ли я изобретать велосипед или нет. Если существует решение для сортировки моего массива таким образом, я был бы признателен за вашу помощь. Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете попробовать отфильтровать группы, а затем преобразовать их в дату, а затем выполнить сортировку для каждой группы.
Есть возможность улучшить этот код.
const array = [
{year:'1938', month:'6', day:'3'},
{year:'1935', month:'5', day:'3'},
{year:'1935', month:'', day:''},
{year:'1935', month:'5', day:''},
{year:'1934', month:'3', day:''},
{year:'1934', month:'3', day:'15'},
{year:'1934', month:'', day:''}
];
const yearSort = array => {
return array.filter(item => item.year && !item.month && !item.day).map(item => {
return {
item,
date: new Date(parseInt(item.year),0,1)
}
}).sort((a,b) => a.date < b.date ? -1 : 1)
.map(i => i.item)
}
const yearMonthSort = array => {
return array.filter(item => item.year && item.month && !item.day).map(item => {
return {
item,
date: new Date(parseInt(item.year),item.month - 1,1)
}
}).sort((a,b) => a.date < b.date ? -1 : 1)
.map(i => i.item)
}
const yearMonthDaySort = array => {
return array.filter(item => item.year && item.month && item.day).map(item => {
return {
item,
date: new Date(parseInt(item.year),item.month - 1,parseInt(item.day))
}
}).sort((a,b) => a.date < b.date ? -1 : 1)
.map(i => i.item)
}
const sorted = yearSort(array)
.concat(yearMonthSort(array))
.concat(yearMonthDaySort(array))
console.info({ sorted });Спасибо вам обоим. Я могу выбрать только один ответ, но оба верны. Большое спасибо!
В вашей функции сравнения сортировки первый год проверки, когда тот же месяц проверки и когда такая же проверка за день.
const array = [
{ year: "1938", month: "6", day: "3" },
{ year: "1935", month: "5", day: "3" },
{ year: "1935", month: "", day: "" },
{ year: "1935", month: "5", day: "" },
{ year: "1934", month: "3", day: "" },
{ year: "1934", month: "3", day: "15" },
{ year: "1934", month: "", day: "" },
];
array.sort((a, b) => {
if (a.year === b.year) {
if (a.month === b.month) {
return +a.day - +b.day;
}
return +a.month - +b.month;
}
return +a.year - +b.year;
});
console.info(array);Спасибо вам обоим. Я могу выбрать только один ответ, но оба верны. Большое спасибо!
Когда нет дня, он должен считаться днем 0 (или 1, если вы считаете 1 наименьшим возможным днем). Если месяца нет, он должен считаться месяцем 0 (или 1). Таким образом, вы можете отсортировать один массив.