Мой алгоритм правильный? (значение в диапазоне или нет) - PullRequest
0 голосов
/ 10 октября 2019

Мне нужно определить, находится ли моя специальная строка в определенном диапазоне или нет?

Пример:

// range
[
  "01-01-001-001",
  "01-01-001-140"
]
// string
"01-01-001-001" 

Нам нужно определить, находится ли строка в указанном диапазоне? Строка представляет собой набор «уровней», разделенных тире («-»):

 4    3    2     1
01 - 01 - 001 - 001

4,3,2,1 - веса. 4 - самое высокое, а 1 - самое низкое.

Ниже приведена моя isInRange функция, которая проверяет, что:

 function isCodeInRange (code, range) {
  var start = range[0].split('-'),
      end = range[1].split('-'),
      parts = code.split('-')
  ;

  if (parts[0] !== start[0]) {
    return false;
  }


  for (var i = 1, len = parts.length; i < len; i++) {
    if (!(Number(parts[i]) >= Number(start[i]) && Number(parts[i]) <= Number(end[i]))) {
       if ((Number(parts[i - 1]) >= Number(end[i - 1]))) {
         return false;
       }
    }
  }

  return true;
}

console.log(isCodeInRange(
    '01-01-140-01',
    ['01-01-138-01', '01-02-140-01']
))

Итак, как вы видите, результат этой проверки верен. Некоторые тесты:

console.log(isCodeInRange(
    '01-02-140-01',
    ['01-01-138-01', '01-02-140-01']
)) // true

console.log(isCodeInRange(
    '01-01-101-01',
    ['01-02-138-01', '01-03-140-01']
)) // false

console.log(isCodeInRange(
    '01-01-001-01',
    ['01-01-001-01', '01-01-140-01']
)) // true

Правильн ли мой алгоритм? Они охватывают все возможные угловые дела?

1 Ответ

1 голос
/ 10 октября 2019

Вы можете разделить строки и номера карт и проверить их по диапазонам.

function isCodeInRange(values, ranges) {
    ranges = ranges.map(s => s.split('-').map(Number));
    return values
        .split('-')
        .map(Number)
        .every((v, i) => ranges[0][i] <= v && v <= ranges[1][i]);
}

console.log(isCodeInRange('01-02-140-01', ['01-01-138-01', '01-02-140-01'])); // true not false
console.log(isCodeInRange('01-01-101-01', ['01-02-138-01', '01-03-140-01'])); // false
console.log(isCodeInRange('01-01-001-01', ['01-01-001-01', '01-01-140-01'])); // true

Версия без every и ES5.

function isCodeInRange(values, ranges) {
    var every = true;
    ranges = ranges.map(function (s) { return s.split('-').map(Number); });
    values
        .split('-')
        .map(Number)
        .forEach(function (v, i) {
            every = every && ranges[0][i] <= v && v <= ranges[1][i];
        });

    return every;
}

console.log(isCodeInRange('01-02-140-01', ['01-01-138-01', '01-02-140-01'])); // true not false
console.log(isCodeInRange('01-01-101-01', ['01-02-138-01', '01-03-140-01'])); // false
console.log(isCodeInRange('01-01-001-01', ['01-01-001-01', '01-01-140-01'])); // true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...