javascript - 生成列表中没有的5位随机码

标签 javascript

我的要求是生成 5 位唯一代码,该代码不在列表中。

例如,如果我有 [12345, 54321, 13245, 11234] ,我想生成34522等等..我正在使用下面的代码

function id(){
    var text = "", can = "12345";
    for( var i = 5; i--; text += can.charAt(Math.floor(Math.random() * can.length)));
    return text;
}

var list = [12345, 54321, 13245, 11234];
var generated;
while(!generated){
   var t = makeid();
      if(list.indexOf(t) == -1){
          generated = t;
      }
}

这工作正常,但是当列表增长时,这将花费更多时间(?)。还有其他方法可以编写这个机制吗?

最佳答案

作为@elclanrs said ,最好使用哈希方法

var obj = {};
for(var i=0; i<list.length; ++i) { obj[list[i]] = true; }

然后检查

obj.hasOwnProperty(t);

最好使用 hasOwnProperty 而不是 in 以避免在原型(prototype)链中搜索。

<小时/>

但是,您可以使用 ES6 Set 来简化它:

var set = Set(list);

然后检查

set.has(t)

请注意,并非所有浏览器都支持它。

<小时/>

请注意,id 返回一个字符串,但 list 是一个数字数组!

要解决这个问题,请将 id 转换为数字(例如使用一元 +),或使用类似的内容

function id() {
    var num = 0, len = 5;
    for(var i=0; i<len; ++i) {
        num *= 10;
        num += Math.floor(Math.random() * len) + 1;
    }
    return num;
}

关于javascript - 生成列表中没有的5位随机码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25676477/

相关文章:

javascript - 如何在 JavaScript 中取消选择输入类型 ='button'

javascript - 使用 webpack (Babel/ES6) 导入 moment-timzone 和 moment-range

javascript - 通过javascript在同一个打开的选项卡中重新加载新的网页内容

javascript - 监听Bootstrap DatetimePicker中的点击事件

javascript - 在 WordPress 的向下滚动事件中隐藏 div

javascript - 如何在鼠标右键的 "contextmenu"事件上选择对象

javascript - XSJS 获取{key :value} paired result from SQL query

javascript - Laravel:上传从数组创建的多行

javascript - 如何将图像文件添加到表格单元格,其中这两个元素都是使用 JS 动态创建的?

javascript - 输入数字后自动在输入中添加货币符号