【发布时间】:2014-10-29 20:27:21
【问题描述】:
我的要求是生成 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;
}
}
这很好用,但是当列表增长时,这将花费更多时间(?)。有没有其他方法可以写这个机制。
【问题讨论】:
-
如果只是数字,您可以使用哈希方法。
var seen={},然后是if(!(x in seen)){seen[x]=1}。这样会更快。 -
@elclanrs 是的,这是真的。但是假设列表是一个数组,有很多我无法改变的操作。对不起
-
您没有抓住重点,我的意思是使用对象作为缓存,而不是在数组上调用
indexOf。将缓存保存在闭包中。 -
@elclanrs 喜欢
var obj = {}, for(var i = list.length; i--; obj[list[i]] = true)然后if(t in obj)?
标签: javascript