我的要求是生成 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/