Прежде всего, спасибо за ответы. Вы внесли небольшую ошибку в семантику функции, поскольку она должна возвращать один и тот же идентификатор, если я дважды запрашиваю одну и ту же строку.
E.g.:
htmlid("foo bar"); // -> "foo.bar"
htmlid("foo bar"); // -> "foo.bar"
htmlid("foo.bar"); // -> "foo.bar0"
htmlid("foo.bar0"); // -> "foo.bar00"
htmlid("foo.bar"); // -> "foo.bar0"
Однако, я принял ваши функции:
var htmlid = (function () {
var cache = {},
ncache = {},
reg = /[^A-Za-z0-9_:.-]/;
return function (s) {
var id;
if (s in cache) {
id = cache[s];
} else {
id = s.replace(reg,".");
if (id in ncache) {
id += ncache[id]++;
}
ncache[id] = 0;
cache[s] = id;
}
return id;
};
}());