Хороший вопрос.Учитывая ваши требования, я не вижу большого выбора, как действовать дальше.Как предположил ThatBlairGuy, битовая карта, кажется, является подходящим вариантом.Ваши 300 вариантов выбора переводятся в 300 бит.Теперь я лично предпочел бы использовать только 6 бит на байт, чтобы сделать быстрый и простой перевод на base64 для целей хранения.300/6 = 50 символов для значений, поступающих из раскрывающегося списка.
Значение любого параметра должно быть жестко закодировано, хотя вы не можете удалить или добавить его в середине: любое новое предпочтениедолжен быть добавлен в конце битовой карты или использовать бит, который больше не используется где-то на карте.
Редактировать: Учитывая комментарии re.немного карты, я уточню, что я имел в виду для реализации.Если предположить, что бит соответствует каждому выключателю определенной опции (запись в выпадающем списке):
this.bitmap = [];
this.customBase64code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+-";
...
// index=index of bit within bit map, on=state of the bit
this.setOption=function(index,on) {
var islot = Math.floor(index / 6);
var ibit = index % 6;
if ( this.bitmap[islot] === undefined ) {
while ( this.bitmap.length <= islot ) {
this.bitmap.push(0);
}
}
if (on) {
this.bitmap[islot] |= (1 << ibit);
}
else {
this.bitmap[islot] &= ~(1 << ibit);
}
};
this.getOption=function(index) {
var islot = Math.floor(index / 6);
if ( this.bitmap[islot] === undefined ) {
return 0;
}
return this.bitmap[islot] & (1 << (index % 6));
};
this.getStringFromOptions=function() {
var bitmap64 = [];
var encoder64 = customBase64code.split('');
var n = this.bitmap.length;
for ( var i = 0; i < n; i++ ) {
bitmap64.push(encoder64[this.bitmap[i]]);
}
return bitmap64.join('');
};
this.getOptionsFromString=function(s) {
var bitmap64 = s.split('');
var decoder64 = this.customBase64code;
var n = bitmap64.length;
for ( var i = 0; i < n; i++ ) {
this.bitmap.push(decoder64.indexOf(bitmap64[i]));
}
};
Отказ от ответственности: я не проверял ничего из перечисленного.