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。