Простой подход состоит в том, чтобы получить все значения идентификаторов, отсортировать их, а затем, начиная с 0, искать первое пропущенное число в последовательности. Это может быть хорошо, если эффективность не имеет значения, но более эффективный метод:
- Получить идентификаторы
- Сортировать их
- Пройдите по значениям, чтобы получить следующий доступный номер
- Вставить значение в список идентификаторов
- Сохранить значение, чтобы в следующий раз оно начиналось с # 3 по сравнению с предыдущим значением + 1
например.
class IDStore {
constructor(dataArray) {
if (!Array.isArray(dataArray)) {
return null;
}
this.previousIndex = 0;
this.indexes = dataArray.map(obj => obj.id).sort();
}
get nextIndex() {
while (this.indexes[this.previousIndex] == this.previousIndex) {
this.previousIndex++;
}
return this.previousIndex;
}
addIndex(index) {
if (!Number.isInteger(index) || this.indexes.find[index]) {
return null;
}
this.indexes.push(index);
this.indexes.sort();
return index;
}
}
var data = [ { id: 1 }, { id: 2 }, { id: 5 }, { id: 3 } ];
// Create an ID store
var idStore = new IDStore(data);
// Insert more objects in the array with unique IDs
for (var i=0, next; i<4; i++) {
// Current list of indexes
console.log('Indexes: ' + idStore.indexes);
// Get the next available index
next = idStore.nextIndex;
console.log('Next available: ' + next);
// Calling nextIndex doesn't affect next index
next = idStore.nextIndex;
console.log('Next available: ' + next);
// Use next index
data.push({id: next});
// Adding next index is manual
idStore.addIndex(next);
console.log('Added: ' + next);
}
// Data structure is independent
console.log('End: ' + JSON.stringify(data));
Это несколько упрощенно, поскольку предполагается, что идентификаторы являются последовательными целыми числами, начинающимися с 0, и не требуют большой проверки или обработки ошибок.
Поддержание идентификатора отдельно от добавления новых членов в массив данных. Было бы гораздо лучше объединить операции, поэтому метод «добавить объект» получает следующий доступный идентификатор, добавляет его к объекту, добавляет объект в массив, обновляет индекс и возвращает новый идентификатор.