Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.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
jquery ui自动完成的客户端缓存:javascript/jquery正则表达式以匹配字符串;索引“;物体的形状_Javascript_Jquery_Regex_Jquery Ui Autocomplete_Javascript Objects - Fatal编程技术网

jquery ui自动完成的客户端缓存:javascript/jquery正则表达式以匹配字符串;索引“;物体的形状

jquery ui自动完成的客户端缓存:javascript/jquery正则表达式以匹配字符串;索引“;物体的形状,javascript,jquery,regex,jquery-ui-autocomplete,javascript-objects,Javascript,Jquery,Regex,Jquery Ui Autocomplete,Javascript Objects,在我的web应用程序中,我使用存储在数据库(Mysql)中的数据。 在这个应用程序中,我有管理部门的官方数据,我允许用户输入他们自己的数据。数据将显示在自动完成下拉列表中。 管理数据是有限的,永远不会更改,因此会预加载并缓存在内存中,而用户数据则不会(因为用户数据呈指数增长,如果所有数据都要缓存在内存中,则没有必要使用数据库)。 因此,我在我的web应用程序中进行多级缓存,其中,我在客户端缓存autocomplete的用户数据(而不是在每次搜索时从db获取数据)。 场景如下: 当应用程序加

在我的web应用程序中,我使用存储在数据库(Mysql)中的数据。
在这个应用程序中,我有管理部门的官方数据,我允许用户输入他们自己的数据。数据将显示在自动完成下拉列表中。
管理数据是有限的,永远不会更改,因此会预加载并缓存在内存中,而用户数据则不会(因为用户数据呈指数增长,如果所有数据都要缓存在内存中,则没有必要使用数据库)。

因此,我在我的web应用程序中进行多级缓存,其中,我在客户端缓存autocomplete的用户数据(而不是在每次搜索时从db获取数据)。

场景如下:
当应用程序加载时,管理数据(在内存中预加载)将加载并缓存在一个JS对象中,以便在自动完成机制中使用

因此,当用户搜索一个单词时,它将检查admin data JS对象,如果找不到,它将转到db并在用户数据中找到它

因此,对于在db中搜索用户数据的情况,我现在要做的是:

$( "#search" ).autocomplete({
source:function(request, response) {
var results = $.ui.autocomplete.filter(data, request.term);
if (request.term.toUpperCase() in autocomplete_cache) {
    response($.map(autocomplete_cache[request.term.toUpperCase()], function(item) {
     return {value: item.members.name, md5: item.members.ID}
    }))
   
    return;
   }
其中,autocomplete_缓存是一个javascript对象:

var autocomplete_cache = {};
// ...it gets filled everytime a new $.post gets new data
...autocomplete_cache[request.term.toUpperCase()] = data;
目前,它正在缓存用户搜索的确切术语。
例如,如果用户写入了尚未缓存的“ABCD”:

-->转到数据库(MySQL)执行:“WHERE term Like%ABCD%”
-->自动完成_缓存[“ABCD”]=“从mysql解析的数据”


因此,如果同一用户现在重新键入“ABCD”,它将从自动完成缓存对象中获取它
但是,如果用户键入“ABC”,则由于以下行的原因,无法从缓存对象中获取:

if (request.term.toUpperCase() in autocomplete_cache)
因此,我想做的是匹配用户在缓存中键入的内容,因此在这种情况下,如果用户键入“ABC”(包含在缓存的“ABCD”字符串中),自动完成将构建一个包含“ABCD”的下拉列表


有办法吗?此要求的原因不是在缓存对象中查找确切的字符串索引,而是它将查找更大的范围,从而限制需要到db查找新匹配项的可能性。

不是查找特定的键,而是测试每个键是否为子串:

var term = request.term.toUpperCase();
for (var key in autocomplete_cache) {
    if (key.indexOf(term) > -1) {
        // term is contained in key
    }
}
不要在第一次匹配时调用
response
,而是在另一个数组中收集所有匹配项,并在最后调用
response

var term = request.term.toUpperCase(),
    items = [];
for (var key in autocomplete_cache) {
    if (key.indexOf(term) > -1) {
        items.merge($.map(autocomplete_cache[key], function(item) {
            return {value: item.members.name, md5: item.members.ID}
        });
    }
}
if (items.length > 0) response(items);
在调用
response
之前,您可能还希望删除
项中的任何重复项,并对结果项进行排序:

var term = request.term.toUpperCase(),
    items = [],
    index = {};
for (var key in autocomplete_cache) {
    if (key.indexOf(term) > -1) {
        $.each(autocomplete_cache[key], function(item) {
            var id = item.members.ID;
            if (!index[id]) {
                items.push({value: item.members.name, md5: item.members.ID});
                index[id] = true;
            }
        });
    }
}
items.sort(function(a, b) { return a.name.localeCompare(b.name); });
if (items.length > 0) response(items);

这在逻辑上是怎么回事?如果缓存了
abo
,然后他们尝试
ab
并在缓存中找到
abo
,则您得到的是
abo
的结果,而不是
ab
,这可能意味着看不到某些结果。我没有理解这个问题吗?@KevinB我希望正则表达式匹配任何包含用户类型的内容,例如:用户类型abc,而您缓存了abo,abcde,因此下拉列表将显示:abo,abcde ie所有包含abc的内容