搜索自动完成的结构

时间:2017-08-30 15:28:02

标签: javascript jquery

我有这样的自动完成功能。

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....
    }
}

2 个答案:

答案 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;
});

几个问题,

  1. 您的数据数据有多大?
  2. 您是否只计划了查找时间?
  3. 如果您的列表很小,您是否在代码中执行了不应该在查找例程中的任何其他内容?
  4. 这是您正在使用的jQuery UI自动填充吗?
  5. 要优化您拥有的for循环,将比for in循环快得多。

    此外,我怀疑您正在使用自动填充功能,因此您会为用户输入的每个前缀获得n个结果,在这种情况下,查找将无效,因此......具体取决于您的用例和所需结果,您可能会更好地使用不同的数据结构...可能是trie Here is one that was prepared earlierThe 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);
});