#javascript #typescript #rrule
#javascript #typescript #rrule
Вопрос:
У меня есть следующее правило в строковом формате:
DTSTART;TZID=America/Toronto:20160909T040000RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;UNTIL=20161202T040000
Я хочу разобрать свойства строки в их собственные соответствующие переменные, чтобы использовать входные данные внутри формы для обновления. Одни и те же свойства RRULE будут отображаться в каждой строке, поэтому я знаю, например, что DTSTART
это всегда будет в строке.
Я думал об использовании метода string search
, указав свойство по его имени, а затем добавив количество символов для добавления, чтобы получить позицию объекта и want, а затем использовать .substring()
Так, например, если бы я пытался извлечь UNTIL
, я мог бы сделать:
export const parseUntilFromRRule = (rrule: string):Date => {
const posInRRule = rrule.search("UNTIL=");
const until = rrule.substring(posInRRule 6);
return new Date(until);
};
Однако для свойств в середине строки, где длина значения может меняться, этот метод не будет работать, потому что я не буду знать значение второго параметра для передачи в substring
Какой обобщенный метод я могу использовать для извлечения каждого свойства RRULE из строки?
Ответ №1:
Я бы использовал здесь разделение строки дважды:
var input = "DTSTART;TZID=America/Toronto:20160909T040000RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;UNTIL=20161202T040000";
var rrule = input.split("RRULE:")[1].split(";")[0];
console.log(rrule);
Ответ №2:
Вы можете разделить на точки с запятой, затем разделить каждый результат на =
, если запись содержит a =
, и превратить результат в объект:
const input = `DTSTART;TZID=America/Toronto:20160909T040000RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;UNTIL=20161202T040000`;
const segments = input.split(';');
const entryKeyValues = Object.fromEntries(
segments.map(
segment => segment.includes('=')
? segment.split('=')
: [segment, '']
)
);
console.log(entryKeyValues);
console.log(entryKeyValues.UNTIL);
Комментарии:
1. Не полное решение, но это избавит меня от необходимости писать несколько дополнительных утилит! Я могу использовать это для свойств, для которых оно работало, и использовать принятый ответ для
FREQ
иDTSTART