Есть задача сортировать пользователей по дате последнего входа в систему.
Я использовал метод 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
, но как не знаю.
Разумней было бы сделать примерно так:
myArray.sort((a ,b ) => {
return new Date(a.lastLoginAt) - new Date(b.lastLoginAt);
});
где a.lastLoginAt, b.lastLoginAt - это что-то пригодное для конструктора Date.
как ответил 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
Я получаю данные из JSON-файла в файле actionsjs и устанавливаю их в reducer sections:
Стало напрягать создавать ручками много файлов и хотелось бы немного автоматизировать процессКаким инструментом можно создавать файлы...
Новичок в реакте, понимаю в теории, но не могу сделать это на практике, как можно добавить элемент по клику в таблицу с 3-мя полями по инпуту?