我的要求是生成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;
}
}
这很好用,但是当列表增长时,这会花费更多时间(?)。有没有其他方法可以编写这种机制。
答案 0 :(得分:1)
作为@elclanrs said,最好使用哈希方法
var obj = {};
for(var i=0; i<list.length; ++i) { obj[list[i]] = true; }
然后检查
obj.hasOwnProperty(t);
最好使用hasOwnProperty
而不是in
来避免在原型链中进行搜索。
但是,您可以使用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;
}