问题描述
我目前有这个级别的对象及其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万级,否则您不必担心性能或内存等问题,因此请选择最容易维护的内容。