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,因此我想为每个 ID 分配Symbol一个唯一 ID,并且仍然能够知道该 ID 对应于Symbol. 所以我喜欢有symbol_前缀的想法,但我不喜欢手动输入的symbol_0想法symbol_500

我应该如何生成唯一 ID?我可以在声明上述数组时自动执行此过程并生成唯一 ID 吗?

更新
在客户端做这个实际上是个好主意吗?

4

3 回答 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"
于 2011-04-17T01:02:14.060 回答
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());
}
于 2011-04-17T01:04:56.623 回答
0

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

如果这些数据在会话中持久存在并存储在服务器端,那么最好在服务器上执行此部分。

于 2011-04-17T01:01:25.133 回答