Как узнать, в какой диапазон попадает заданное число, используя Object

JSFiddle: https://jsfiddle.net/oaxgzsr1/

Кстати, random на самом деле не случайное число, а переменная. Извини за это.

Скрипт:

  var random = 5;
  var rangeof = "";

  /* option #1 */
  if (random > 0 && random <= 5)
  rangeof = "1-5";
  if (random > 5 && random <= 10)
  rangeof = "6-10";
  if (random > 10 && random <= 15)
  rangeof = "10-15";
  if (random > 15 && random <= 20)
  rangeof = "16-20";
  if (random > 20 && random <= 25)
  rangeof = "21-25";
  //and so forth until we hit 100


  /* option #2 */
  var ranges = {
  1: "1-5",
  2: "1-5",
  3: "1-5",
  4: "1-5",
  5: "1-5",
  6: "6-10",
  7: "6-10",
  8: "6-10",
  9: "6-10",
  10: "6-10"
  //and so forth until we hit 100
  };

  alert(ranges[5]);

Как вы можете видеть, это может стать длинным и очень сложным в обслуживании.

Есть ли способ сделать что-то вроде этого:

  var ranges = {
    1-5: "1-5",
    6-10: "6-10",
    11-15: "11-15",
    16-20: "16-20"
  }

Таким образом, для любого заданного числа я могу получить значение ключа, используя диапазон.

Например:

если число равно 7, оно попадает в диапазон ключей 6-10, и я бы получил значение 6-10.

Напишите цикл для создания массива из любого применимого диапазона входных чисел и заполните его массивами из двух значений (нижний и верхний пределы диапазонов). Затем вы можете использовать свою технику поиска.

Pointy 13.02.2019 16:33

Если интервалы постоянно равны 5, как следует из вашего описания, то почему бы не немного арифметики, чтобы определить, куда падает число? Например. Math.floor(7/5)*5

Andy G 13.02.2019 16:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
53
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

вы можете использовать цепочку ifs:

let random = Math.round(Math.random() * 99 + 1) // I assume the number is never below 1
let rangeof


if (random < 6)
  rangeof = "1-5"
else if (random < 15)
  rangeof = "6-14"
else if (random < 100)
  rangeof = "15-99"
  
console.info(rangeof)

Или просто сохраните свои границы в массиве (при условии, что нет пустого интервала) и выполните итерацию по ним:

let bounds = [1, 6, 15, 60, 100]
let random = Math.round(Math.random() * 99 + 1)
let rangeof


upper = bounds.findIndex(bound => bound > random)
if (upper == 0) throw 'bad number, should be a positive integer' 
if (upper == -1) throw `bad number, should be lower than ${bounds[bounds.length - 1]}`
rangeof = bounds[upper - 1] + '-' + (bounds[upper] - 1)

console.info(`${random} is in ${rangeof}`)

Спасибо, я пытался избежать цепочки if, потому что она может стать длинной и, скажем, уже не 5, а 4, тогда мне придется редактировать ее снова.

Si8 13.02.2019 16:39

О, у вас диапазоны разделены 5 на 5? Тогда вы можете посмотреть на один из других ответов. Мой для разных диапазонов

Ulysse BN 13.02.2019 16:40

Вы можете рассчитать интервал для случайного числа.

var random = Math.floor(Math.random() * 100 + 1),
    size = 5,
    slot = Math.floor((random - 1) / size),
    interval = [slot * size + 1, (slot + 1) * size].join('-');

console.info(random, interval);

@libik, теперь так и должно быть.

Nina Scholz 13.02.2019 16:44

Вы можете создать простую функцию для этого. Просто выполните итерацию внутри ваших диапазонов с определенным шагом диапазона и проверьте мин./макс.

const startRange = 1;
const endRange = 20;
const rangeStep = 4;

function getNumberRange(number){
  for(let i = startRange; i<endRange; i+=rangeStep+1){
    if (number >= i && number <= i+rangeStep){ 
      console.info(`${number} range: ${i}-${i+rangeStep}`);
    }
  }
}


getNumberRange(3);
getNumberRange(5);
getNumberRange(10);
getNumberRange(11);

Какова вероятность того, что мы случайно выбрали те же числа для тестирования :)

libik 13.02.2019 16:43

Ахах, как смешно, случайное число на самом деле не случайно. У нас одинаковый мозговой компилятор... @libik А ты ответил через 10 секунд после меня...

Alexis 13.02.2019 16:46
Ответ принят как подходящий

Всегда ли логика одинакова и монотонна? Тогда вы можете сделать это следующим образом:

const range = 5;

function inWhatRange(num) {
   const multiple = Math.floor( (num-1) / range);
   return `${multiple*range + 1}-${(multiple+1)*range}`;
}

console.info(inWhatRange(3));
console.info(inWhatRange(5));
console.info(inWhatRange(10));
console.info(inWhatRange(11));

Прошу прощения, не уточнил. Переменная random — это просто любое число, а не случайно сгенерированное число. Имеет ли это смысл?

Si8 13.02.2019 16:40

@Si8 Si8 - я спрашиваю, нужны ли вам настраиваемые диапазоны, такие как 1-5, 6-17, 18-33, или они всегда такие же, как вы описали

libik 13.02.2019 16:41

Это всегда одно и то же... так что 1-5, ,6-10... и т. д. Этот диапазон всегда останется прежним. Спасибо.

Si8 13.02.2019 16:46

@ Si8 - тогда никаких обновлений не требуется, то, что я разместил, всегда будет работать так, как ожидалось.

libik 13.02.2019 16:47

Ваш кажется наиболее эффективным способом достижения этого. Я приму ваш ответ. Я проголосовал за все остальные ответы, поскольку это также другие способы, которыми я мог бы выполнить свою задачу. Спасибо вам и всем остальным за помощь!

Si8 13.02.2019 16:50

Базовый расчет найдет сегмент, в который попадает значение:

var x = 7;

var lower = Math.floor((x - 1) / 5) * 5;
var upper = lower + 5;
var range = (lower + 1) + "-" + upper; // "6-10"

Автор попросил 6-10, а не 5-10

libik 13.02.2019 16:42

Немного опоздал на вечеринку, но это тоже работает

   function getRange(x, interval, start, end) {
      if (x < interval) {
        console.info("range is " + start + " - " + interval);
      } else {
        var set = Math.ceil(x/interval);
        console.info("range is " + ((set * interval) - (interval - 1)) + " - " + set * interval)
      }
    }

    getRange(26, 5, 1, 100) // "range is 26 - 30"
    getRange(5, 5, 1, 100) // "range is 1 - 5"
    getRange(12, 5, 1, 100) // "range is 11 - 15"

Вау, ваше решение выходит далеко за рамки... Спасибо!!!! Я +1 ваш ответ. Никогда не поздно мой друг

Si8 13.02.2019 17:01

Другие вопросы по теме