搜索结构自动完成
问题描述:
我有这样的自动完成。搜索结构自动完成
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
});
我可以按名称搜索的话,我能得到名称,比如jame
,el
...
但是我想最终是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;
});
的几个问题,
- 你有多大的数据阵列?
- 你只计算查找时间吗?
- 如果您的列表很小,您是否在代码中执行其他任何不应该在查找例程中的任何操作?
- 这是您使用的jQuery UI自动完成功能吗?
要优化你有一个for
循环将比for in
循环快得多。
此外,我怀疑你正在使用自动完成,所以你得到n
结果为每个用户输入的前缀,在这种情况下,查找将无法正常工作,因此...取决于你的用例和期望的结果,你可能会更好地使用完全不同的数据结构...可能是trie
Here is one that was prepared earlier。 The 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);
});