Bloodhound识别bug?

时间:2015-06-14 05:29:19

标签: typeahead.js twitter-typeahead

我使用的是最新版本的typeahead.js(v0.11.1)。当对数据集值使用不同的id时,我观察到了奇怪的行为。

我创建了JSFiddle。这是js代码:

var ds = new Bloodhound({
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    local: [{id: 1, name: "a b 1"}, {id: 2, name: "a b 2"}, {id: 3, name: "a"}],
    identify: function(obj) { return obj.id; }
});

$('#go').typeahead(null, {
    name: 'ds',
    display: 'name',
    source: ds
});

如果我更改了本地'的数据,现在预先输入可能会出现故障。以下只是一些例子:

将这些值中的一个用于本地' (注意第三个元素是以' 1'开头的随机数字):

[{id:1,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:15,姓名:&#34 ;一个"}]

[{id:1,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:1849,姓名:&#34 ;一个"}]

现在,当我进入文本框:" a b"时,预计会提前输入" a b 1"和" a b 2",但事实上它只建议" a b 1"。

这可以通过以下方法之一解决:

  • 更改' id'第三个元素的属性为不以' 1'开头的值。例如:

    [{id:1,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:23,姓名:&#34 ;一个"}]

  • 更改'名称'第三个元素的属性为不以' a'开头的值。例如:

    [{id:1,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:15,姓名:&#34 ; S"}]

  • 删除'识别' Bloodhound构造函数对象的属性。

还有什么,如果我使用大于2的数字作为第一个元素的id,就像这样:

[{id:3,姓名:" ab 1"},{id:2,姓名:" ab 2"},{id:15,姓名:&#34 ;一个"}]

现在当我进入" b"进入文本框,没有任何建议!

1 个答案:

答案 0 :(得分:5)

回答我自己的问题。是的,猎犬有一个错误。 SearchIndex.getIntersection()函数未正确实现。您可以取出此功能并按以下方式进行测试:

getIntersection([1,2,15],[1,2])

它应该返回[1,2]作为结果,但实际上它返回[1]。这是因为它错误地使用sort()函数来排序数字。根据w3schools:

  

默认情况下,sort()方法将值排序为字符串   按字母顺序排列。

     

这适用于字符串(" Apple"来自" Banana")。然而,   如果数字按字符串排序," 25"大于" 100",因为   " 2"大于" 1"。

因此可以通过更改以下两行来修复此功能:

        arrayA = arrayA.sort();
        arrayB = arrayB.sort();

成:

        arrayA = arrayA.sort(function(a, b){return a-b});
        arrayB = arrayB.sort(function(a, b){return a-b});

花了我一天才发现:(