Я пишу прототип javascript для строки, которая будет принимать формат DateTime PHP и преобразовывать его в формат Moment.js DateTime. Однако у меня возникла проблема с построением последней строки. У меня в основном это работает, но я не знаю, как сохранить нормальные символы. Проблема с моим кодом в том, что я в основном разбиваю строку любым не-альфа-символом. Это означает, что когда я перестраиваю преобразование, он не включает другой символ. Я не знаю, как решить эту проблему. Мой код ниже
String.prototype.toMoment = function() {
var items = this.split(/[^A-Za-z]/);
var returnItem = "";
var conversions = {
'd': 'DD',
'D': 'ddd',
'j': 'D',
'l': 'dddd',
'N': 'E',
'S': 'o',
'w': 'e',
'z': 'DDD',
'W': 'W',
'F': 'MMMM',
'm': 'MM',
'M': 'MMM',
'n': 'M',
't': '',
'L': '',
'o': 'YYYY',
'Y': 'YYYY',
'y': 'YY',
'a': 'a',
'A': 'A',
'B': '',
'g': 'h',
'G': 'H',
'h': 'hh',
'H': 'HH',
'i': 'mm',
's': 'ss',
'u': 'SSS',
'e': 'zz',
'I': '',
'O': '',
'P': '',
'T': '',
'Z': '',
'c': '',
'r': '',
'U': 'X',
};
for (var item in items) {
returnItem += conversions[items[item]];
}
return returnItem;
}
например, если я использую следующий код moment().format('m/d/Y H:i:s'.toMoment()), он действительно работает и преобразует возвращаемую строку в MMDDYYYYHHmmss. Проблема в том, что мне нужно вернуть MM/DD/YYYY HH:mm:ss. Любая помощь будет оценена, спасибо!
нет, я закончил, мне нужно просто сделать .split(''), а затем написать оператор if, который проверяет, находится ли элемент в списке преобразования, если это так, преобразовать, если не добавить элемент в строку



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


Вместо разделения вы можете попробовать заменить заполнители новыми заполнителями:
String.prototype.toMoment = function() {
var conversions = {
'd': 'DD',
'D': 'ddd',
'j': 'D',
'l': 'dddd',
'N': 'E',
'S': 'o',
'w': 'e',
'z': 'DDD',
'W': 'W',
'F': 'MMMM',
'm': 'MM',
'M': 'MMM',
'n': 'M',
't': '',
'L': '',
'o': 'YYYY',
'Y': 'YYYY',
'y': 'YY',
'a': 'a',
'A': 'A',
'B': '',
'g': 'h',
'G': 'H',
'h': 'hh',
'H': 'HH',
'i': 'mm',
's': 'ss',
'u': 'SSS',
'e': 'zz',
'I': '',
'O': '',
'P': '',
'T': '',
'Z': '',
'c': '',
'r': '',
'U': 'X',
};
return this.replace(/[A-Za-z]+/g, function(match) {
return conversions[match] || match;
});
}
console.info('m/d/Y H:i:s'.toMoment());Это тоже сработает, я проверю, какой из двух ответов работает лучше. Хотя мне больше нравится, как ты выглядишь. ржу не могу
Ваш работает примерно на 10-15% быстрее, я отмечу ваш как ответ, как только переполнение стека позволит мне. Спасибо за элегантный ответ.
Такой подход, вероятно, лучший с точки зрения гибкости и скорости.
Я должен просто сделать .split(''), а затем написать оператор if, который проверяет, находится ли элемент в списке преобразования, если это так, преобразовать, если не добавить элемент в строку
String.prototype.toMoment = function() {
var items = this.split('');;
var returnItem = "";
var conversions = {
'd': 'DD',
'D': 'ddd',
'j': 'D',
'l': 'dddd',
'N': 'E',
'S': 'o',
'w': 'e',
'z': 'DDD',
'W': 'W',
'F': 'MMMM',
'm': 'MM',
'M': 'MMM',
'n': 'M',
't': '',
'L': '',
'o': 'YYYY',
'Y': 'YYYY',
'y': 'YY',
'a': 'a',
'A': 'A',
'B': '',
'g': 'h',
'G': 'H',
'h': 'hh',
'H': 'HH',
'i': 'mm',
's': 'ss',
'u': 'SSS',
'e': 'zz',
'I': '',
'O': '',
'P': '',
'T': '',
'Z': '',
'c': '',
'r': '',
'U': 'X',
};
for (var item in items) {
if (conversions[items[item]] != undefined) {
returnItem += conversions[items[item]];
}else{
returnItem += items[item];
}
}
return returnItem;
}
Еще одна небольшая вариация, которая работает. Вы всегда можете просто сделать полное разделение, но добавить не буквенно-цифровые символы, которые вы хотите, в свой поиск перевода следующим образом:
String.prototype.toMoment = function() {
var items = this.split("");
var returnItem = "";
var conversions = {
'd': 'DD',
'D': 'ddd',
'j': 'D',
'l': 'dddd',
'N': 'E',
'S': 'o',
'w': 'e',
'z': 'DDD',
'W': 'W',
'F': 'MMMM',
'm': 'MM',
'M': 'MMM',
'n': 'M',
't': '',
'L': '',
'o': 'YYYY',
'Y': 'YYYY',
'y': 'YY',
'a': 'a',
'A': 'A',
'B': '',
'g': 'h',
'G': 'H',
'h': 'hh',
'H': 'HH',
'i': 'mm',
's': 'ss',
'u': 'SSS',
'e': 'zz',
'I': '',
'O': '',
'P': '',
'T': '',
'Z': '',
'c': '',
'r': '',
'U': 'X',
'/': '/',
':': ':',
' ': ' '
};
for (var item in items) {
returnItem += conversions[items[item]];
}
return returnItem;
}
console.info('m/d/Y H:i:s'.toMoment())Это действительно зависит от того, что вы хотите сделать и какой контроль над результатом вам нужен.
Это сработает, но я думаю, что @ 31piy, вероятно, имеет лучшее универсальное решение, кажется, даже справляется с такими вещами, как когда некоторые просто вводят «вторник» в строку.
Да, я увидел его ответ незадолго до того, как опубликовал свой, и увидел, что замена регулярного выражения была предпочтительным инструментом, но все равно подумал, что все равно отправлю свои два цента.
можно просто добавить в конвертацию
/?