Преобразование системной сущности Dialogfow duration из минут в секунды в JavaScript

Я ищу способы преобразовать системную сущность Duration (@ sys.duration) из Dialogflow в код JavaScript с минут на секунды.

Я спрашиваю пользователя на определенное время, когда пользователь может ответить, например:

  • 20 минут
  • 5 минут

и Т. Д.

этот ввод сохраняется в переменной the_duration. Теперь, чтобы произвести определенные вычисления, мне нужно преобразовать это в секунды. Как я могу этого добиться?

РЕДАКТИРОВАТЬ: Возможно, это поможет, если мне нужно извлечь число из строки? Я пробовал искать этот способ, но приведенные примеры не подходят для этого конкретного случая с минутами.


person Velionis    schedule 29.04.2020    source источник


Ответы (1)


@sys.duration системный объект отправит вам объект с двумя атрибутами, " сумма », содержащая целое число, и« единица », содержащее строку.

Итак, в Javascript это будет представлено примерно так:

{
  "amount": 20,
  "unit": "min"
}

Чтобы преобразовать это в секунды, вы должны найти, сколько секунд находится в предоставленной «единице», и умножить это на количество.

Хороший способ выполнить этот поиск - создать объект, который имеет в качестве атрибутов возможные имена единиц и в качестве значений количество секунд. Это хорошо работает для большинства единиц до недели. Однако когда у вас наступает месяц или год (или больше), у вас возникают проблемы, поскольку количество секунд для этих периодов может быть различным. Чтобы представить их, я помечу их как отрицательные числа, чтобы вы могли проверить, не удалось ли выполнить преобразование. (Я игнорирую проблемы с изменением часов, например, из-за перехода на летнее / летнее время.)

Я не тестировал этот код полностью, но он кажется правильным. Эта функция позволяет передать объект, отправленный в параметре the_duration, и вернет количество секунд:

function durationToSeconds( duration ){
  const mult = {
    "s":      1,
    "min":    60,
    "h":      60*60,
    "day":    60*60*24,
    "wk":     60*60*24*7,
    "mo":     -1,
    "yr":     -1,
    "decade": -1
  };
  return duration.amount * mult[duration.unit];
}

Извлечение числа из строки, безусловно, возможно, и вы можете адаптировать эту функцию для работы таким образом, но поскольку Dialogflow уже предоставляет его вам как объект с нормализованными строками, это будет значительно сложнее.

person Prisoner    schedule 01.05.2020
comment
А, это хороший дубль. Однако я работаю с Voiceflow, а не с Dialogflow, если быть точным. И в голосовом потоке мне ничего не возвращают, как вы сказали (я считаю, что это работает только при работе непосредственно в Dialogflow) - person Velionis; 01.05.2020
comment
Обновите свой вопрос, чтобы отразить то, что вы используете. Отображение того, что вы пробовали, журналов, значений параметров и других примеров того, что вы делаете, может помочь нам помочь вам вместо того, чтобы гадать, что вы имеете в виду. См. Как мне задать хороший вопрос? - person Prisoner; 01.05.2020