Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找表和整数范围-javascript_Javascript_Node.js - Fatal编程技术网

查找表和整数范围-javascript

查找表和整数范围-javascript,javascript,node.js,Javascript,Node.js,所以我希望创建查找表。但是,我遇到了一个整数范围的问题,而不仅仅是1、2、3等。以下是我得到的: var ancient = 1; var legendary = 19; var epic = 251; var rare = 1000; var uncommon = 25000; var common = 74629; var poolTotal = ancient + legendary + epic + rare + uncommon + common; var pool = general

所以我希望创建查找表。但是,我遇到了一个整数范围的问题,而不仅仅是1、2、3等。以下是我得到的:

var ancient = 1;
var legendary = 19;
var epic = 251;
var rare = 1000;
var uncommon = 25000;
var common = 74629;
var poolTotal = ancient + legendary + epic + rare + uncommon + common;
var pool = general.rand(1, poolTotal);



 var lootPool = {
  1: function () {
      return console.log("Ancient");
     },
     2-19: function () {

      }
    };
当然,我知道
2-19
是行不通的,但我也尝试过像[2-19]之类的东西

好的,更多信息: 当我调用时:
lootPool[pool]()
它将选择一个介于1和
poolTotal
之间的整数,具体取决于该整数是否为
1
,它将在控制台中记录为0。如果它在
2到19的范围内命中,它将成为传奇。按照我的数字等等

编辑:我很清楚我可以用开关轻松地完成这项工作,但我想用这种方式试试。

我建议创建一个(小)对象,选择一个随机数,而不是创建一个巨大的查找表(这很可能,但非常不雅),然后在对象中查找值大于随机数的第一个条目:

//基本权重:权重彼此成比例
常量基本权重={
古代:1,,
传奇人物:19岁,
epic:251,
稀有品种:1000,
不寻常:25000,
普通电话:74629,
};
让totalWeightSoFar=0;
//重量:重量与总重量成比例
const lootWeight=Object.entries(baseLootWeight).map([rarity,weight])=>{
总重量Sofar+=重量;
返回{稀有,重量:totalWeightSoFar};
});
控制台日志(重量);
常量随机类型=()=>{
const rand=Math.floor(Math.random()*totalWeightSoFar);
返回重量
.find(({rarity,weight})=>weight>=rand)
.稀有性;
};

对于(让i=0;i<10;i++)console.log(randomType())这不是查找,但这可能会对您有所帮助

let loots = {
    "Ancient": 1,
    "Epic": 251,
    "Legendary": 19
};

//We need loots sorted by value of lootType
function prepareSteps(loots) {
    let steps = Object.entries(loots).map((val) => {return {"lootType": val[0], "lootVal": val[1]}});
    steps.sort((a, b) => a.lootVal > b.lootVal);
    return steps;
}

function getMyLoot(steps, val) {
    let myLootRange;
    for (var i = 0; i < steps.length; i++) {
        if((i === 0 && val < steps[0].lootVal) || val === steps[i].lootVal) {
            myLootRange = steps[i];
            break;
        }
        else if( i + 1 < steps.length &&  val > steps[i].lootVal && val < steps[i + 1].lootVal) {
            myLootRange = steps[i + 1];
            break;
        }
    }
    myLootRange && myLootRange['lootType'] ? console.log(myLootRange['lootType']) : console.log('Off Upper Limit!');
}

let steps = prepareSteps(loots);
let pool = 0;
getMyLoot(steps, pool);
让战利品={
"古":一,,
“史诗”:251,
“传奇”:19
};
//我们需要按lootType的值排序的战利品
功能准备(战利品){
让steps=Object.entries(loots.map((val)=>{return{“lootType”:val[0],“lootVal”:val[1]});
步骤.排序((a,b)=>a.lootVal>b.lootVal);
返回步骤;
}
函数getMyRoot(步骤,val){
让我的旅行;
对于(var i=0;isteps[i].lootVal&&val
当我键入此内容时,我不是有意冒犯您——我真的不明白您想要实现什么。这可能表明您需要在文章正文中提供更多的上下文,或者您缺少了一个标签,该标签可以提供对技术和目标的更多了解。就我的两分钱--也许我今天理解得太慢了。补充了更多信息。。。不确定它是否对你有帮助。不知道这些东西有什么作用,但它很有效,非常棒,谢谢!尽管如此,现在我必须弄清楚如何向它添加功能,而不仅仅是坐在稀有的名字上。如果我更改
const rand=Math.floor(Math.random()*totalWeightSoFar)至<代码>常数rand=20它打印出传奇。它不应该打印epic吗?
lootWeight
对象的值表示累积重量,任何等于或高于该值的随机数都对应一个稀有值,至少与所考虑的稀有值相同。相比之下,基本权重与稀有比率相对应,这更直观。(例如古代的
比传奇的
可能性小19倍)。如果
rand
值为20,则会找到
{rarity:'legendary',weight:20}
对象,因为最初的
rand
是为
古代
保留的。