如何将随机数与这些值之一匹配?

问题描述

我目前有这个级别的对象及其exp要求。

const levels = {
  1: 50,2: 75,3: 125,4: 200,5: 350,6: 500,7: 1000,8: 1250,9: 2500,10: 5000,11: 7500,12: 10000,13: 15000,14: 30000,15: 50000,16: 75000,17: 100000,18: 200000,19: 300000,20: 400000,21: 500000,22: 750000,23: 1000000,24: 2500000,25: 5000000,};

我也有一个用户拥有的exp数量。我该如何从这些对象值中找到最接近的数字并获得用户水平?

解决方法

我将在这里采用递归方法:

const levels = {
  1: 50,2: 75,3: 125,4: 200,5: 350,6: 500,7: 1000,8: 1250,9: 2500,10: 5000,11: 7500,12: 10000,13: 15000,14: 30000,15: 50000,16: 75000,17: 100000,18: 200000,19: 300000,20: 400000,21: 500000,22: 750000,23: 1000000,24: 2500000,25: 5000000,};

const userXP = 749999;

const getUserLevel = (xp,levelToCheck = 1) => {
  // the base case
  if (xp >= 5000000) return 25;
  // if the level above the one we're currently checking has a 
  // bigger requirement than the xp we're checking,// return the current Level,otherwise call this function with the 
  // next higher level
  return levels[levelToCheck + 1] > xp ? levelToCheck : getUserLevel(xp,levelToCheck + 1);
};

console.log(getUserLevel(userXP));

,

您可以对它进行二进制搜索。

Observable

,并且索引应该是第一个大或等于或最后一个索引。 那么您可以检查下一个值是否接近exp,然后执行所需的操作

,

大概,某人只有在达到或高于所需的经验值时才能获得一定的水平。 (这是您在做的游戏吗?喜欢游戏的人做作业吗?)

无论如何,由于对象是按升序排序的,所以没有任何跳转,因此您可以使用Object.entries()来找到它:

function getLevel(myPoints) {
  return Object.entries(levels)
    .filter(([level,exp]) => exp <= myPoints)
    .pop()[0];
}

Object.entries()将对象转换为数组数组。 .filter()除去了exp <= myPoints条目以外的所有内容。 pop()[0]抓取最后一个元素(具有最高级别的元素)并返回该级别([0]是级别,[1]是该级别的最小点)。

我发现这比已经发布的循环解决方案和递归解决方案更容易理解。其他人可能不同意我的观点,这很好。使用最容易理解的解决方案。除非这可以扩展到1500万级,否则您不必担心性能或内存等问题,因此请选择最容易维护的内容。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...