javascript - 生成唯一ID js

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

我需要它来完成这个测试。
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/

    相关文章:

    javascript - 使用 JQuery $.get 调用服务器端 onclick

    javascript - array.push 到数组中的数组

    java - 数组未正确设置值

    angularjs - 如何使用 Jasmine/karma 正确注入(inject)工厂并进行测试?

    javascript - Safari 12.1 卸载不触发 javascript

    javascript - 图像更改循环不起作用

    javascript - knockout 数据绑定(bind)到自行生成的 DOM

    javascript - 如何比较 2 个数组,从数组的匹配中返回键以重写第一个数组中的键

    javascript - 单元测试使用 Karma 和 Jasmine 使用react

    angular - 如何测试是否从 angular 组件调用服务