Как сравнивать грубые строки времени в JavaScript - PullRequest
0 голосов
/ 16 ноября 2018

На самом деле я хочу сравнить строки длительности времени.

var str1 = "2 Hours 15 Minutes"; //possible value "2 Hr 15 Min"
var str2 = "3 Hours 9 Minutes"; //possible value "3 Hr 9 Min"
if(str1 > str2) ???

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Если вы хотите общее решение, вам нужно решить, какой уровень обобщения вы должны поддерживать. Это может варьироваться от простого анализа регулярных выражений до чего-то более подходящего для нейронной сети. Предполагая первое, более простым обобщением будет поддержка строк и форматов number units с известными единицами. Вы можете сделать простой поиск, который дает единицу, кратную в секундах. Чтобы пойти еще дальше, у вас может быть даже список союзов, которые будут удалены как and или plus:

const units = {
  'seconds': 1,
  'minutes': 60,
  'hours': 3600,
  'hr': 3600,
  'min': 60,
  'sec': 1,
  'days': 86400

  // etc...
}
const stopwords = /and|plus|\+/gi // will be replaced with space

function gteSeconds(str)  {
  let times = str
      .replace(stopwords, ' ')
      .match(/\d+\s+\w+/g).map(t => t.split(/\s+/))
      
  return times.reduce((total, [time, unit]) => total + time * units[unit.toLowerCase()]
  , 0)
}
console.log(gteSeconds('3 Hours 9 Minutes'))
console.log(gteSeconds('20 seconds'))
console.log(gteSeconds('20 seconds 2 minutes'))
console.log(gteSeconds('1 Hr and 2 sec'))
console.log(gteSeconds('20 sec + 2 sec'))
0 голосов
/ 16 ноября 2018

Это не тривиальная проблема, если вы хотите решить ее правильно!

Я бы предложил использовать одну из библиотек, которая позволяет легко разбирать даты и иметь функции сравнения.

Первое, что приходит мне в голову, это moment.js, который имеет удивительный способ сравнения длительностей - moment-duration.

Длительность момента, однако, должна быть построена с использованием следующего синтаксиса, например:

let duration = moment.duration(1, 'minutes);    

(подробнее здесь: https://momentjs.com/docs/#/durations/creating/)

Вам нужно разбить строки длительности на части, состоящие из числа и единицы длительности:

let str1 = '2 Hours 15 Minutes';
let durationStrings = str1.match(/\d+ [a-zA-Z]+/g);

После этого шага, у вас будет массив строк примерно такого типа:

['2 hours', '15 minutes'];

После этого нам нужно разделить строки во второй раз, чтобы построить правильную длительность. Затем мы будем использовать наши значения дляокончательная продолжительность строительства:

// Create empty duration first...
let duration = moment.duration();

durationStrings.forEach((durationString) => {
  let durationArguments = durationString.split(' '); // We just use space as delimiter

  if (durationArguments.length === 2) {
    duration.add(Number(durationArguments[0]), durationArguments[1]);
  }
});

console.log(duration);

Если вы проверяете объект окончательной продолжительности, он должен содержать правильную длительность после итераций.

Давайте теперь обернем его в функцию с именем convertToDuration(string).

Обратите внимание на две вещи:

  • Мы предполагаем, что каждый durationString содержит число, затем пробел, а затем выражение продолжительности
  • . Мы должны преобразовать string в number в цикле, так как moment-duration предполагает, что первый аргумент является числом

Теперь единственное, что нужно сделать, - это построить обе продолжительности, как указано выше, и сравнить их, например, с помощью:

let duration1 = convertToDuration(str1);
let duration2 = convertToDuration(str2);

// If duration subtraction is negative, first one is smaller!
let subtractionResult = duration1.subtract(duration2).as('milliseconds');

if (subtractionResult < 0) {
  // Your logic here
} 

Мое решение можно найти здесь: https://jsbin.com/berijuduza

0 голосов
/ 16 ноября 2018

Вам нужно будет проанализировать строку и преобразовать ее в некоторое общее значение (минуты в моем коде), а затем сравнить числа.

Поскольку ваши строки имеют стандартную структуру, вы можете использовать простое регулярное выражение с String.match() для извлечения чисел. Умножьте 1-е число на 60 и добавьте второе, чтобы получить количество минут.

function parseTimeString(str) {
  var hours = str.match(/\d+(?=\s+(Hours|Hr))/g) || [0];
  var min = str.match(/\d+(?=\s+Min)/g) || [0];
  return +hours[0] * 60 + +min[0];
}

function compareTimeStrings(str1, str2) {
  return parseTimeString(str1) > parseTimeString(str2);
}

var str1 = "2 Hours 15 Minutes"; //possible value "2 Hr 15 Min"
var str2 = "3 Hours 9 Minutes"; //possible value "3 Hr 9 Min"

console.log(compareTimeStrings(str1, str2));

// parseTimeString examples
console.log(parseTimeString(''));
console.log(parseTimeString('2 Hours')); // 120
console.log(parseTimeString('5 Minues')); // 5
console.log(parseTimeString('5 Minutes 2 Hours')); // 125
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...