jQuery“自动完成”插件搞乱了我的数据顺序

我在几个不同的页面上使用了Jorn Zaefferer的Autocomplete插件。 在这两种情况下,显示的字符串的顺序有点混乱。

示例1:字符串数组:基本上它们按字母顺序排列,除了已被推到顶部的常识:

一般知识,艺术与设计,商业研究,公民,设计与技术,英语,地理,历史,ICT,数学,MFL法语,MFL德语,MFL西class牙语,音乐,体育,PSHE,宗教教育,科学,其他

显示的字符串:

一般知识,地理,艺术与设计,商业研究,公民,设计与技术,英语,历史,ICT,数学,MFL法语,MFL德语,MFL西class牙语,音乐,体育,PSHE,宗教教育,科学,其他

请注意,在通用知识之后,地理位置已被推到第二项。 剩下的都很好。

示例2:字符串数组:如上所述,但使用跨课程而不是常识。

跨课程,艺术与设计,商业研究,公民,设计与技术,英语,地理,历史,ICT,数学,MFL法语,MFL德语,MFL西class牙语,音乐,体育,PSHE,宗教教育,科学,其他

显示的字符串:

跨学科,公民身份,艺术与设计,商业研究,设计与技术,英语,地理,历史,ICT,数学,MFL法语,MFL德语,MFL西class牙语,音乐,体育,PSHE,宗教教育,科学,其他

在这里,公民身份已被推到第二位。

我做了一点实验,似乎有一个错误说“把东西放在与第一个项目之后的第一个项目相同的字母开头,剩下的就是其余的”。 有点神秘。 我通过触发自动完成插件代码中的警报尝试了一些调试,但在我能看到的任何地方,它都使用了正确的顺序。 它似乎只是在它被certificate它出错了。

任何人的想法? 最大

编辑 – 回复克林特

谢谢你指着我的相关代码btw。 为了使诊断更简单,我将值数组更改为[“carrot”,“apple”,“cherry”],自动完成重新排序为[“carrot”,“cherry”,“apple”]。

这是为stMatchSets生成的数组:

stMatchSets =({”:[#1 = {value:“胡萝卜”,数据:[“胡萝卜”],结果:“胡萝卜”},#3 = {值:“苹果”,数据:[“苹果”] ,结果:“apple”},#2 = {value:“cherry”,数据:[“cherry”],结果:“cherry”}],c:[#1#,#2#],a:[# 3#]})

因此,它将第一个字母收集到一个地图中,这作为首次匹配策略是有意义的。 我想要它做的是,在填充显示的列表时,使用给定的值数组而不是映射。 我无法理解代码内容中缓存的内容(我对javascript不是很有经验)。

已解决 – 我通过黑客攻击插件中的javascript来解决这个问题。
在第549行(或565),我们返回一个变量csub,它是一个保存匹配数据的对象。 在它返回之前,我重新排序,以便顺序匹配我们给出的原始值数组,即我们用于构建索引,我已经放入另一个变量:

csub = csub.sort(function(a,b){return originalData.indexOf(a.value)> originalData.indexOf(b.value);})

hacky但它​​的确有效。 我个人认为这种行为(可能编码得更干净)应该是插件的默认行为:即,结果的顺序应该与原始传递的可能值数组相匹配。 这样,用户可以按字母顺序对其数组进行排序,如果他们想要(这是微不足道的)按字母顺序获得结果,或者他们可以保留自己的“自定义”顺序。

我做了什么,而不是你的解决方案是添加

if (!q && data[q]){return data[q];} 

就在上面

 var csub = []; 

发现〜535行。

如果我理解正确的话,这样做是为了获取输入为空时的缓存数据,在第472行中指定: stMatchSets[""] = [] 。 假设输入为空时的缓存数据是您提供的第一个数据,那么它就是好的。

我不确定这个自动完成插件,但你确定它不只是试图给你最好的匹配吗? 我的自动完成插件做了一些启发式操作,并对这种性质进行了重新排序。

这让我得到了另一个答案:那里有一百万个jQuery自动完成插件。 如果这个不满足你,我相信还会有另一个。

编辑:事实上,我完全确定它正在做什么。 看看第474行:

 // loop through the array and create a lookup structure for ( var i = 0, ol = options.data.length; i < ol; i++ ) { /* some code */ var firstChar = value.charAt(0).toLowerCase(); // if no lookup array for this character exists, look it up now if( !stMatchSets[firstChar] ) 

等等。 所以,这是一个function。