Как я должен генерировать уникальные идентификаторы для группы объектов? - PullRequest
5 голосов
/ 17 апреля 2011

У меня есть массив, состоящий из A LOT из 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. Поскольку спецификации HTML не допускают дублирования идентификаторов, я хочу назначить каждому Symbol уникальный идентификатор и по-прежнему иметь возможность знать, что этот идентификатор соответствует Symbol. Поэтому мне нравится идея иметь префикс symbol_, но мне не нравится идея вручную набирать от symbol_0 до symbol_500.

Как мне генерировать уникальные идентификаторы? Могу ли я автоматизировать этот процесс и создать уникальный идентификатор при объявлении вышеуказанного массива?

UPDATE
Это действительно хорошая идея сделать это на стороне клиента?

Ответы [ 3 ]

8 голосов
/ 17 апреля 2011

Создайте функцию, которая увеличивает счетчик:

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"
1 голос
/ 17 апреля 2011

Простой объект, который отслеживает количество вызовов, должен работать.

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());
}
0 голосов
/ 17 апреля 2011

Если у вас есть только около 500 вариантов выбора, вы можете просто хэшировать содержимое символа вместе с реализацией JS MD5 или даже просто использовать генератор JS UUID, как этот: http://ajaxian.com/archives/uuid-generator-in-javascript

Если эти данные являются постоянными во время сеансов и на стороне сервера, лучше выполнить эту часть на сервере.

...