【问题标题】:Bloodhound identify bug?猎犬识别错误?
【发布时间】:2015-06-14 05:29:18
【问题描述】:

我正在使用最新版本的 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, name: "a b 1"}, {id: 2, name: "a b 2"}, {id: 15, name: "a"}]

[{id: 1, name: "a b 1"}, {id: 2, name: "a b 2"}, {id: 1849, name: "a"}]

现在当我输入文本框:“a b”时,预输入应该提示“a b 1”和“a b 2”,但实际上它只提示“a b 1”。

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

  • 将第三个元素的“id”属性更改为不以“1”开头的值。示例:

    [{id: 1, name: "a b 1"}, {id: 2, name: "a b 2"}, {id: 23, name: "a"}]

  • 将第三个元素的“name”属性更改为不以“a”开头的值。示例:

    [{id: 1, name: "a b 1"}, {id: 2, name: "a b 2"}, {id: 15, name: "s"}]

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

此外,如果我使用大于 2 的数字作为第一个元素的 id,如下所示:

[{id: 3, name: "a b 1"}, {id: 2, name: "a b 2"}, {id: 15, name: "a"}]

现在当我在文本框中输入“a b”时,没有任何建议!

【问题讨论】:

    标签: typeahead.js twitter-typeahead


    【解决方案1】:

    回答我自己的问题。是的,猎犬中有一个错误。 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});
    

    我花了 1 天时间才知道:(

    【讨论】:

    • 感谢您的解决方案。这是另一种方式,我们可以将 id 值转换为字符串return obj.id.toString();
    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多