我需要将用户首选项存储在cookie中。
如果我将所有唯一(8个字符)值存储在cookie中,那么它将会过载。我需要一种机制来进行一些映射,以便将最小值存储在cookie中。
我的要求与this question匹配,但唯一的区别是我有大量数据集(每个选择列有100个项目)。
答案 0 :(得分:3)
两种可能性:
A)使您的值数字和2的幂(1,2,4,8,16等)并将单个值存储在cookie中作为位图。 (或者在服务器端代码中,将不同的值映射到2的幂。)
B)将值作为分隔列表存储在cookie中。
更新时间:下午6:40
看到您有可能进行大量选择,我的原始解决方案都无法正常工作。为了处理大量的数据,我认为您需要创建某种“会话ID”,保存数据库或其他持久存储中的实际设置,并将会话ID存储在cookie中。
(您当然希望在浏览器会话期间仅保留cookie并在您可以合理地确定浏览器会话结束后删除存储的设置 - 可能需要一周左右。)
答案 1 :(得分:2)
这是一个很好的问题。鉴于您的要求,我没有看到如何继续做出太多选择。正如ThatBlairGuy建议的那样,有点地图似乎是要走的路。您的300个选择转换为300位。现在我个人会坚持每字节仅使用6位,以便快速轻松地转换为base64,用于存储目的。对于来自下拉列表的值,300/6 = 50个字符。
任何首选项的值都必须硬编码,但是你不能在中间删除或添加任何内容:必须在位图的末尾添加任何新的首选项,或者使用一个位不再在地图中的某个地方使用过。
编辑:鉴于评论重新。位图,我将充实我实现的想法。假设有一点,每个对应一个特定选项的开启开关(下拉框中的一个条目):
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]));
}
};
免责声明:我没有测试上述任何一项。
答案 2 :(得分:1)
您可以存储所选项目的索引。例如,如果用户从列表A,列表B中的项目4和列表C的前10项中选择了项目1和3,那么您将得到以下内容:
A[0,2],B[3],C[0-9]
你必须编写一些简单的解析代码来读出值。
在最糟糕的情况下,当用户选择了所有奇数或偶数项目时,对于包含总共100个项目的列表,您将需要大约150个字符。如果用户选择了所有100个项目,则只需A[0-99]
。