如何为一组对象生成唯一ID?

6

我有一个由很多Symbol对象组成的数组:

var symbols = {
    alpha : new Symbol('alpha', 'symbol_0', '&#x03B1', 'GreekSymbol'),
    beta : new Symbol('beta', 'symbol_1', '&#x03B2', 'GreekSymbol'),
    gamma : new Symbol('gamma', 'symbol_2', '&#x03B3', 'GreekSymbol'),
    delta : new Symbol('delta', 'symbol_3', '&#x03B4', 'GreekSymbol'),

    ... about 500 of these different types of symbols...
};
Symbol对象的第二个参数是一个在HTML中使用的ID。由于HTML规范不允许重复的ID,我希望为每个Symbol分配一个唯一的ID,并且仍然能够知道这个ID对应于一个Symbol。因此,我喜欢有symbol_前缀的想法,但我不喜欢手动输入symbol_0symbol_500的想法。
我应该如何生成唯一的ID?当我声明上面的数组时,我能自动化这个过程并生成一个唯一的ID吗?
更新: 这样做客户端是否真的是个好主意呢?
3个回答

9

编写一个函数来增加计数器:

function makeCounter() {
    var i = 0;
    return function() {
        return i++;
    }
}

var id = makeCounter();

现在每次调用 id 都会返回一个唯一的值:
id(); // 0
id(); // 1
id(); // 2
id(); // 3

像这样使用:

new Symbol('alpha', 'symbol_' + id(), '&#x03B1,', 'GreekSymbol')

一个更完整的版本将允许您指定前缀和可选的起始值:
function generateId(prefix, start) {
    var i = start || 0;
    return function() {
        return prefix + i++;
    }
}
// start the counter at 12
var id = generateId("symbol_", 12);
id();

输出:

"symbol_12"

为什么每次调用函数时重置变量“i”的值,makeCounter不会每次返回1 - Sir
你只需要调用一次 makeCounter 函数。它在这里被调用:var id = makeCounter();。之后,你需要调用由 makeCounter 返回的函数,我们将其赋值给了 id。这个函数会闭包变量 i,这意味着每次调用都会增加同一个计数器。 - Wayne

1
一个简单的对象,可以跟踪调用次数。
function IdGenerator(baseName) {
    this.baseName = "" + baseName;
    this.number = 0;
}

IdGenerator.prototype.next = function () {
    return "" + this.baseName + this.number++;
};

var gen = new IdGenerator("symbol_")
for (var i = 0; i < 100; i++) {
    console.log(gen.next());
}

我非常喜欢能够指定前缀的想法。这真的很好,谢谢! - Hristo
1
@ChaosPandion... 为什么你在添加东西之前有两个双引号 "" - Hristo
@Hristo 如果 this.baseName 不是字符串,请重新输入... - Milano

0

如果您只有大约500个选项可供选择,您可以将符号的内容与JS MD5实现一起哈希,甚至只需使用像这样的JS UUID生成器:http://ajaxian.com/archives/uuid-generator-in-javascript

如果此数据在会话之间持久存在并存储在服务器端,则最好在服务器上完成此部分。


1
JS是Javascript。MD5是哈希算法。UUID是唯一标识符。 - Winfield Trail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接