我有一个由 A LOT Symbol
个对象组成的数组:
var symbols = {
alpha : new Symbol('alpha', 'symbol_0', 'α', 'GreekSymbol'),
beta : new Symbol('beta', 'symbol_1', 'β', 'GreekSymbol'),
gamma : new Symbol('gamma', 'symbol_2', 'γ', 'GreekSymbol'),
delta : new Symbol('delta', 'symbol_3', 'δ', 'GreekSymbol'),
... about 500 of these different types of symbols...
};
Symbol
对象的第二个参数是将在HTML中使用的ID。由于HTML规范不允许重复ID,因此我想为每个Symbol
分配一个唯一ID,并且仍然能够知道此ID对应于Symbol
。所以我喜欢使用symbol_
前缀,但我不喜欢通过symbol_0
手动输入symbol_500
的想法。
我应该如何生成唯一ID?当我声明上述数组时,我可以自动执行此过程并生成唯一ID吗?
更新
做这个客户端实际上是个好主意吗?
答案 0 :(得分:7)
创建一个递增计数器的函数:
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(), 'α,', '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"
答案 1 :(得分: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());
}
答案 2 :(得分:0)
如果您只有500个左右可供选择,您可以只使用JS MD5实现来散列符号的内容,或者甚至只使用像这样的JS UUID生成器:http://ajaxian.com/archives/uuid-generator-in-javascript
如果此数据在会话和存储的服务器端之间保持不变,那么最好在服务器上执行此部分。