Элегантное решение для определения того, в какой диапазон попадает числовое значение - PullRequest
1 голос
/ 23 октября 2019

Если я поставлю число для функции, как бы я проверил его по диапазону чисел, как этот?

1-10  = A
11-20 = B
21-30 = C
...

Я знаю, что могу сделать if операторы для оценки этого, ноЯ ищу что-то более изящное, потому что проблема становится намного более сложной, и я не хочу неприятной паутины ifs.

var letter = "";

function getLetter(num) {
  if (num >= 1 && num <= 10) {
    letter = "A";
  } else if (num >= 11 && num <= 20) {
    letter = "B";
  }
  // this eventually gets gross
}

Ожидаемый результат getLetter(14) будет "B", иgetLetter(49) будет "E" и т. Д. Корпус / переключатель также не включен в список по аналогичным причинам.

Любые другие идеи приветствуются.

Ответы [ 2 ]

6 голосов
/ 23 октября 2019

Просто точка о вашем коде

function getLetter(num) {
  if (num >= 1 && num <= 10) {
    letter = "A";
  } else if (num >= 11 && num <= 20) {
    letter = "B";
  }
  // this eventually gets gross
}

это можно упростить до

function getLetter(num) {
  if (num >= 1) {
    if(num <= 10) {
      letter = "A";
    } else if (num <= 20) {
      letter = "B";
    }
    // this eventually gets gross too
  }
}

Но:

Если все так просто, как каждая буква представляет диапазониз 10 значений:

function getLetter(num) {
  return String.fromCharCode(65 + Math.floor((num - 1) / 10));
}
console.log(getLetter(1));
console.log(getLetter(14));
console.log(getLetter(49));

или как предложено

function getLetter(num) {
  const ret = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  return ret[Math.floor((num - 1) / 10)] || "+"; // greater than 260
}
console.log(getLetter(1));
console.log(getLetter(14));
console.log(getLetter(49));
console.log(getLetter(261));

function getLetter(number) {
  let ranges = {
    a: 10,
    b: 20,
    c: 30,
    underflow: 0,
    overflow: Infinity
  }

  return Object.entries(ranges)
  .sort(([ka, va], [kb, vb]) => va - vb) // because object key sort order isn't guaranteed
                                         // though it will be in the order as declared, but
                                         // sorting makes sense
  .find(([key, value]) => number <= value)[0];
}

console.log(getLetter(5))
console.log(getLetter(17))
console.log(getLetter(20))
console.log(getLetter(30))
console.log(getLetter(31))
console.log(getLetter(0))

Если диапазоны смежны, вам нужна только одна из границ

2 голосов
/ 23 октября 2019

Работает нормально, если вы хотите поместить ваши диапазоны в объект, а затем выполнить цикл через это

function getLetter (number) {
  let ranges = {
    a: [1, 10],
    b: [11, 20],
    c: [21, 30],
    d: [31, 36],
    e: [37, 40]
  }

  return Object.keys(ranges).find((key) => {
    let currRange = ranges[key];

    if (number >= currRange[0] && number <= currRange[1]) {
      return key;
    }
  });
}

console.log(getLetter(5))
console.log(getLetter(17))
console.log(getLetter(20))
console.log(getLetter(30))
console.log(getLetter(35))
console.log(getLetter(39))
...