我有这样的自动完成功能。
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....
}
}
答案 0 :(得分:0)
如果您的名称是唯一的,请使用对象哈希,查找时间为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;
});
几个问题,
要优化您拥有的for
循环,将比for in
循环快得多。
此外,我怀疑您正在使用自动填充功能,因此您会为用户输入的每个前缀获得n
个结果,在这种情况下,查找将无效,因此......具体取决于您的用例和所需结果,您可能会更好地使用不同的数据结构...可能是trie
Here is one that was prepared earlier。 The author of JQuery has some ideas as well
答案 1 :(得分:0)
您可以使用事件处理程序.change()
:As the API says,处理此事件的函数将接收所选项目的第二个参数:
...
$('#txtKeywd').autocomplete({
source: data.name,
autoFocus: true,
delay: 500,
minLength: 1
}).change(function (event,item) {
console.log(item.code);
});