【问题标题】:How to find what range a given number falls using Object如何使用 Object 查找给定数字的范围
【发布时间】:2019-02-14 00:40:45
【问题描述】:

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

顺便说一下,随机数实际上并不是一个随机数,而是一个变量。对此感到抱歉。

脚本:

  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

【问题讨论】:

  • 编写一个循环以在任何适用的输入数字范围内创建一个数组,并用两个值的数组(范围的下端和上端)填充它。然后你就可以使用你的查找技术了。
  • 如果从您的描述中可以看出,间隔始终为 5,那么为什么不通过一些算术来计算出一个数字落在哪里呢?例如。 Math.floor(7/5)*5

标签: javascript range


【解决方案1】:

逻辑总是相同且单调的吗?然后你可以这样做:

const range = 5;

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

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

【讨论】:

  • 对不起,我没有澄清。 random 变量只是任何数字,而不是随机生成的数字。这有意义吗?
  • @Si8 - 我在问您是否需要自定义范围,例如 1-56-1718-33 或始终与您描述的相同
  • 它总是一样的......所以1-5,6-10......等等。这个范围将永远保持不变。谢谢。
  • @Si8 - 然后不需要更新,我发布的内容将始终按预期工作
  • 您似乎是完成它的最有效方式。我会接受你的回答。我赞成所有其他答案,因为这些也是我可以完成任务的其他方式。感谢您和其他所有人的帮助!
【解决方案2】:

您可以为此创建一个简单的函数。 只需使用特定的范围步骤在您的范围内迭代并检查最小值/最大值。

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.log(`${number} range: ${i}-${i+rangeStep}`);
    }
  }
}


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

【讨论】:

  • 我们随机选择相同数字进行测试的几率是多少:)
  • 啊哈太有趣了,随机数并不是真正随机的。我们有相同的大脑编译器......@libik 你在我之后 10 秒回答......
【解决方案3】:

你可以计算一个随机数的间隔。

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.log(random, interval);

【讨论】:

  • @libik,现在应该这样了。
【解决方案4】:

晚会有点晚,但这也很有效

   function getRange(x, interval, start, end) {
      if(x < interval) {
        console.log("range is " + start + " - " + interval);
      } else {
        var set = Math.ceil(x/interval);
        console.log("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你的答案。我的朋友从不迟到
【解决方案5】:

一个基本的计算会找到一个值所在的桶:

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
【解决方案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.log(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.log(`${random} is in ${rangeof}`)

【讨论】:

  • 谢谢,我试图避免ifs 的链,因为它可能会变得很长,假设它不再是 5,而是 4,那么我将不得不再次编辑它。
  • 哦,您的范围是 5 乘 5 分隔的吗?然后你可以看看其他答案之一。我的适用于不同的范围
猜你喜欢
  • 2014-09-20
  • 2014-04-27
  • 2020-10-03
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多