Zac*_*cky 2 javascript arrays jasmine
在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;
}
};
Run Code Online (Sandbox Code Playgroud)
我需要它来完成这个测试。
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);
});
Run Code Online (Sandbox Code Playgroud)
我认为我可以制作一个数组,将每个名称推入其中,然后比较唯一性。看起来可能令人沮丧。我想知道是否还有另一种方法,也许可以保证生成时的唯一性或一些不涉及数组的简单比较工具。
编辑:日期戳方法将是确保唯一ID的一种很好的方法,但是不幸的是,我必须使用用于通过另一项测试的ID生成方法。本质上,我需要ID为5个字符,并带有2个大写字母,后跟3个数字。
您可以使用Date.now(),而不是使用自定义的唯一ID生成系统,它会以毫秒为单位返回日期和时间,如下所示:1463004819469。
Date.now()每毫秒变化一次,并且始终不变化。假设您的程序没有多个线程,则必须按顺序进行操作,因此不会有两个ID相同。
例如:
var Robot = function(){
this.name = Date.now(); //1463004819469
}
Run Code Online (Sandbox Code Playgroud)
希望这能解决您的问题!
编辑:如果您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;
}
Run Code Online (Sandbox Code Playgroud)
除非这些ID也不存在于程序外部,否则在这种情况下将不起作用。
| 归档时间: |
|
| 查看次数: |
10120 次 |
| 最近记录: |