生成不在列表中的5位随机码

时间:2014-09-04 23:27:05

标签: 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;
      }
}

这很好用,但是当列表增长时,这会花费更多时间(?)。有没有其他方法可以编写这种机制。

1 个答案:

答案 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;
}