Как я могу эффективно сортировать эти массивы?

Я пытаюсь найти логику в сортировке некоторых массивов, но после нескольких часов мозгового штурма это просто выше моих сил, и, возможно, у вас есть идея.

Допустим, у нас есть массив объектов. Объекты выглядят так:

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){}

    }

и здесь моя логика умерла, потому что мне пришлось сделать еще один, если проверить, меньше или больше месяц, чем то, что у нас уже есть в первом массиве, но мы этого не сделали в начале. Я не знаю, пытался ли я изобретать велосипед или нет. Если существует решение для сортировки моего массива таким образом, я был бы признателен за вашу помощь. Спасибо!

Когда нет дня, он должен считаться днем ​​0 (или 1, если вы считаете 1 наименьшим возможным днем). Если месяца нет, он должен считаться месяцем 0 (или 1). Таким образом, вы можете отсортировать один массив.

Sheraff 24.01.2023 22:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать отфильтровать группы, а затем преобразовать их в дату, а затем выполнить сортировку для каждой группы.

Есть возможность улучшить этот код.

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 });

Спасибо вам обоим. Я могу выбрать только один ответ, но оба верны. Большое спасибо!

Calin Onaca 24.01.2023 23:51

В вашей функции сравнения сортировки первый год проверки, когда тот же месяц проверки и когда такая же проверка за день.

  1. Преобразуйте все значения в числа и сравните.
  2. '' будет 0 (при преобразовании в число из строки с помощью оператора +)

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);

Спасибо вам обоим. Я могу выбрать только один ответ, но оба верны. Большое спасибо!

Calin Onaca 24.01.2023 23:51

Другие вопросы по теме