在 Jasmine 中运行一些测试以尝试使此代码正常工作,发现 id 不是唯一的。这是有道理的,因为它们是这样随机生成的。
var Robot = function(){
this.name = makeid();
function makeid()
{
var text = "";
var possible ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for( var i=0; i < 2; i++ ){
text += possible.charAt(Math.floor(Math.random() * possible.length));
}
var possibleNums ="0123456789";
for( var j=0; j < 3; j++ ){
text += possibleNums.charAt(Math.floor(Math.random() * possibleNums.length));
}
return text;
}
};
我需要它来完成这个测试。
it('there can be lots of robots with different names each', function() {
var i,
numRobots = 10000,
usedNames = {};
for (i = 0; i < numRobots; i++) {
var newRobot = new Robot();
usedNames[newRobot.name] = true;
}
expect(Object.keys(usedNames).length).toEqual(numRobots);
});
我推测我可以创建一个数组,将每个名称推送给它,然后比较唯一性。这看起来可能令人沮丧。我想知道是否还有另一种方法,也许是为了保证生成时的唯一性或一些不涉及数组的简单比较工具。
编辑:日期戳方法将是确保唯一 id 的好方法,但不幸的是我必须使用我用来通过另一个测试的 id 生成方法。本质上,我需要 id 为 5 个字符,2 个大写字母后跟 3 个数字。
最佳答案
您可以使用 Date.now()
,而不是使用您的自定义唯一 ID 生成系统。 ,它以毫秒为单位返回日期和时间,如下所示:1463004819469
.Date.now()
每毫秒都在变化,并且始终保持不变。假设你的程序没有多个线程,事情必须按顺序完成,所以不会有两个相同的 ID。
例如:
var Robot = function(){
this.name = Date.now(); //1463004819469
}
希望这能解决您的问题!
编辑:如果您调用
new Robot()
连续两次,您很可能获得相同的 ID。您可以使用连接 Date.now()
到自定义的唯一 ID 或随机数,例如以下之一:this.name = String(Date.now())+Math.floor(Math.random()*10000);
this.name = String(Date.now())+makeid();
this.name = String(Date.now())+String(counter); //increment this every time you create a Robot
这些只是示例,您可以创建任何您想要的组合。
老实说,你为什么不直接使用计数器呢?像这样:
var counter = 0;
var Robot = function(){
counter++;
this.name = counter;
}
除非 ID 也存在于程序之外,否则在这种情况下,这是行不通的。
关于javascript - 生成唯一ID js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37174096/