Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在cookie中存储和优化大值_Javascript_Jquery_Cookies - Fatal编程技术网

Javascript 如何在cookie中存储和优化大值

Javascript 如何在cookie中存储和优化大值,javascript,jquery,cookies,Javascript,Jquery,Cookies,我需要将用户首选项存储在cookie中 我有三个多选择下拉列表和日期。 允许用户选择下拉列表中的所有值。 如果我将所有唯一的8个字符值存储在cookie中,那么它将过载。我需要一种机制来进行一些映射,以便在cookie中存储最小值 我的要求是匹配的,但唯一的区别是每个select列有100个大数据集。两种可能性: A将您的值设为数字和2的幂1、2、4、8、16等,并将单个值作为位图存储在cookie中。或者在服务器端代码中,将不同的值映射为2的幂 B将值作为分隔列表存储在cookie中 更新时间

我需要将用户首选项存储在cookie中

我有三个多选择下拉列表和日期。 允许用户选择下拉列表中的所有值。 如果我将所有唯一的8个字符值存储在cookie中,那么它将过载。我需要一种机制来进行一些映射,以便在cookie中存储最小值

我的要求是匹配的,但唯一的区别是每个select列有100个大数据集。

两种可能性:

A将您的值设为数字和2的幂1、2、4、8、16等,并将单个值作为位图存储在cookie中。或者在服务器端代码中,将不同的值映射为2的幂

B将值作为分隔列表存储在cookie中

更新时间:下午6:40

鉴于您可能有大量的选择,我的两个原始解决方案都不起作用。要处理如此大量的数据,我认为您需要创建某种会话id,将实际设置保存在数据库或其他持久存储中,并将会话id存储在cookie中


当然,您希望使cookie仅在浏览器会话期间保持,并在您可以合理确定浏览器会话已结束(可能是一周左右)后删除存储的设置。

您可以存储所选项目的索引。例如,如果用户从列表A中选择了项目1和3、从列表B中选择了项目4以及列表C的前10个项目,您将得到如下结果:

A[0,2],B[3],C[0-9]
不过,您必须编写一些简单的解析代码来读取这些值


在最坏的情况下,当用户选择了所有奇数或偶数项时,您将需要大约150个字符来创建一个总共包含100项的列表。如果用户选择了所有100个项目,您只需要一个[0-99]。

这是一个好问题。考虑到你的要求,我看不出还有多少选择余地。正如Blairguy所建议的那样,一张位图似乎是一条可行之路。您的300个选项转换为300位。现在,我个人会坚持每字节仅使用6位,以便快速轻松地转换为base64,用于存储目的。300/6=来自下拉列表的值的50个字符

任何首选项的值都必须永久地硬编码,但您不能在中间删除或添加任何首选项:任何新的首选项都必须添加到位图的末尾,或者使用位图中某个位置不再使用的位

编辑:给出重新编辑的评论。在位图中,我将充实出我对实现的想法。假设一个位,每个位对应一个特定选项的off-on开关,下拉框中有一个条目:

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]));
    }
};

免责声明:我没有测试上述任何一项。

你说的[cookie]过载是什么意思?您是否有超过4k的数据,这些数据与您希望在一个cookie中存储的数据量有关?如果每个唯一值只有8个字符,那么一个cookie中可以存储大约500个值/首选项。可能每个cookie允许的最大字符数,如这里所讨论的:嗨,david,是的,cookie已经有一些其他数据了。因此,如果用户选择下拉列表中的所有值,则按位掩码建议的唯一值大约为300+1,尽管对于大于大约31或53项的列表,您可能会遇到问题,因为。是的,现在我看到了关于300个值可能性的注释,我最初的两种可能性看起来都不是特别可行。是的,但是当用户在页面上移动并执行某些操作时,选择框选项可能会更改。假设我有100个,接下来我将有80个。猜测需要映射值。是的,您必须存储选项的实际值,而不是索引。在这种情况下,还可以使用其他字符作为值,例如字母表。然后,您可以有更多的单字符值,并且在cookie中需要更少的字符。+1表示base64。这比我想象中的十六进制要从单个字符中挤出更多的位。在没有300位整数类型的情况下,在全JavaScript解决方案中,映射回原始值仍然很麻烦,但不是不可克服的。您可以将下拉列表中的值定义为base64字符串中的索引和二的幂的指数的组合。给定base64字符串NiC3和值1_4,索引1处的base64字符将是i,映射到34,位标志将是1,并添加到建议的实现中