Возможно ли написать динамически вложенные if блоки?

208
17 июня 2022, 00:40

Есть задача сортировать пользователей по дате последнего входа в систему.

Я использовал метод sort с moment.js для решения этой задачи. Первое моё решение было такое.

 myArray.sort((a ,b ) => {
     return moment().diff(a.lastLoginAt, "seconds") - moment().diff(b.lastLoginAt, "seconds");
 });

Он не сработал.Проблема как я думаю было в том что разница между датами было очень большое, а конкретно в месяцах.А я хотел взять разницу в секундах и сравнить.

Потом я решил эту задачу таким образом.Проблема в том что код получился ужасным.

    myArray.sort((a ,b ) => {
      if ( moment().diff(a.lastLoginAt, "months") - moment().diff(b.lastLoginAt, "months") === 0 ) {
        if ( moment().diff(a.lastLoginAt, "days") - moment().diff(b.lastLoginAt, "days") === 0 ) {
          if ( moment().diff(a.lastLoginAt, "hours") - moment().diff(b.lastLoginAt, "hours") === 0  ) {
            if ( moment().diff(a.lastLoginAt, "minutes") - moment().diff(b.lastLoginAt, "minutes") === 0  ) {
              if ( moment().diff(a.lastLoginAt, "seconds") - moment().diff(b.lastLoginAt, "seconds") === 0  ) {
                return moment().diff(a.lastLoginAt, "seconds") - moment().diff(b.lastLoginAt, "seconds");
              }
            } else {
              return moment().diff(a.lastLoginAt, "minutes") - moment().diff(b.lastLoginAt, "minutes");
            }
          } else {
            return moment().diff(a.lastLoginAt, "hours") - moment().diff(b.lastLoginAt, "hours");
          }
        } else {
          return moment().diff(a.lastLoginAt, "days") - moment().diff(b.lastLoginAt, "days");
        }
      } else {
        return moment().diff(a.lastLoginAt, "months") - moment().diff(b.lastLoginAt, "months")
      }
    });

Этот код работает следующим образом.Если месяцы равны, он сравнивает по дням если дни равны, то по часам и т.д.

Вопрос в том как написать это более лаконично может как то динамически написать блоки if, но как не знаю.

Answer 1

Разумней было бы сделать примерно так:

 myArray.sort((a ,b ) => {
     return new Date(a.lastLoginAt) - new Date(b.lastLoginAt);
 });

где a.lastLoginAt, b.lastLoginAt - это что-то пригодное для конструктора Date.

Answer 2

как ответил Zhihar timestamp решит проблему и не надо будет столько накручивать НО столько одинаковых строк? почему? не лучше ли обернуть в одну единственную функцию и вызвать ее например так

const isLarge = (a,b,str) => {
  return  moment().diff(a.lastLoginAt, `${str}`) - moment().diff(b.lastLoginAt, `${str}`) === 0
}

и потом вo всех if

if(isLarge(a,b,"months"))

это не ответ к вопросу а лишь попытка улучшения понимания возможностей JS

READ ALSO
Как поместить в state компонента данные из reducer

Как поместить в state компонента данные из reducer

Я получаю данные из JSON-файла в файле actionsjs и устанавливаю их в reducer sections:

214
Универсальный шаблонизатор для файлов на js/ts

Универсальный шаблонизатор для файлов на js/ts

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

181
Русификация Date-picker

Русификация Date-picker

Как сделать русификацию календаря?

238
Как создать элемент по клику в таблице?

Как создать элемент по клику в таблице?

Новичок в реакте, понимаю в теории, но не могу сделать это на практике, как можно добавить элемент по клику в таблицу с 3-мя полями по инпуту?

171