2014-09-04 72 views
0

我的要求是生成不在列表中的5位唯一码。生成不在列表中的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

如果它只是你可以使用一个哈希方法数字。 'var seen = {}',然后'if(!(x in seen)){seen [x] = 1}'。这会更快。 – elclanrs 2014-09-04 23:29:28

+0

@elclanrs是的,这是真的。但假设列表作为一个数组有很多我不能改变的操作。对不起 – redV 2014-09-04 23:31:18

+3

你错过了一点,我的意思是使用一个对象作为缓存,而不是在数组上调用'indexOf'。将缓存保存在闭包中。 – elclanrs 2014-09-04 23:31:58

回答

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; 
} 
+0

感谢您的回答。我使用了相同的方法,并使用下面的散列,而不是使用循环'JSON.parse('{“'+(list.split(',')。join('”:0,''))+'“:0 }');' – redV 2014-09-05 01:14:59