搜索结构自动完成

问题描述:

我有这样的自动完成。搜索结构自动完成

data[0] = {code:1,name:"jame"} 
data[1] = {code:2,name:"el"} 
data[2] = {code:3,name:"hey"} 
. 
. 


$('#txtKeywd').autocomplete({ 
    source: data.name, 
    autoFocus: true, 
    delay: 500, 
    minLength: 1 
}); 

我可以按名称搜索的话,我能得到名称,比如jameel ...

但是我想最终是code

现在我做了这个代码。

我可以用它最终的答案,但它看起来相当多余的和缓慢的。

你有什么好主意?

var txt = $(txtKeywd).val();  
for (i in data.name){ 

    if (data.name[i] === txt){ 
     console.log(data.code[i]); // i can get the code here!!! but it takes time.... 
    } 
} 

如果您的名称是唯一的,请使用对象散列,查找时间为O(1)。

你可以构建它想:

var lookup = 
{ 
    jame: 1, 
    hey: 3, 
    el: 2, 
    'a name with spaces': 87 
}; 

var code = lookup['jame']; // gives 1 

需要注意的是:

var code = lookup['jaem']; // gives undefined 

还要注意,查找关键字(名称)必须遵循有效的JavaScript变量命名约定,否则,您必须将它们放在引号,双“”或单',你的选择

如果你必须有对象的数组为您自动完成工作,那么你可能需要同时使用,但产生从数组中查找,如:

var lookup = {}; 
data.forEach(function(index) 
{ 
    lookup[data[index].name] = data[index].code; 
}); 

的几个问题,

  1. 你有多大的数据阵列?
  2. 你只计算查找时间吗?
  3. 如果您的列表很小,您是否在代码中执行其他任何不应该在查找例程中的任何操作?
  4. 这是您使用的jQuery UI自动完成功能吗?

要优化你有一个for循环将比for in循环快得多。

此外,我怀疑你正在使用自动完成,所以你得到n结果为每个用户输入的前缀,在这种情况下,查找将无法正常工作,因此...取决于你的用例和期望的结果,你可能会更好地使用完全不同的数据结构...可能是trieHere is one that was prepared earlierThe author of JQuery has some ideas as well

您可以使用事件处理.change()As the API says,处理该事件的函数将接收作为第二个参数选择的项目:

... 
$('#txtKeywd').autocomplete({ 
    source: data.name, 
    autoFocus: true, 
    delay: 500, 
    minLength: 1 
}).change(function (event,item) { 
    console.log(item.code); 
});