jQuery自动完成功能返回整个数组,而不是搜索值

时间:2018-10-20 18:34:44

标签: javascript jquery json frontend jquery-ui-autocomplete

下面的自动完成功能从关联的$ filteredUsersArray返回所有用户,而不是我在html输入标签中键入的内容。我只需要获取想要的用户。函数(请求)是否正确执行取决于我输入的内容。该代码适用于标准的非关联数组。我正在传递带有用户ID的关联数组,然后使用该ID来发布私人消息。

自动完成功能:

$userSearchbox.autocomplete({
    source: function(request, response) {

        response($.map($filteredUsersArray, function (value, key) {
            return {
                label: value.username,
                value: key.id
            }
        }));
    }
});

$ filteredUsersArray:

    [{
    "id": "1",
    "userName": "maciek"
}, {
    "id": "2",
    "userName": "stefan"
}, {
    "id": "3",
    "userName": "newuser"
}, {
    "id": "8",
    "userName": "papaitalia"
}, {
    "id": "9",
    "userName": "nowy_user"
}, {
    "id": "12",
    "userName": "zenek"
}]
页面上的

自动完成结果: enter image description here

1 个答案:

答案 0 :(得分:2)

您使用$.map函数不是解决此问题的最佳方法。这是因为映射的概念是以1对1方法将旧项目映射到新项目。如果您要开始的数组有25个项目,并在其上进行映射,则会得到一个也是25个项目的新数组。

您要做的是过滤您的数据!

在原始Javascript领域,您可以在任何数组上调用便捷的.filter()函数。但是在jQuery领域中,该函数称为$.grep(array, function);。第一个参数是要过滤的原始数组。第二个参数是一个函数,非常重要。

您传递给$.grep调用的函数是一个测试,它将对原始数组中的每个项目调用一次。如果测试返回true,则将要测试的项目添加到新数组中。如果测试返回false,则该项目不会添加到新数组中。整个$.grep函数的结果是一个 new数组,其中仅包含通过测试的项目。过滤数组!!! :D

您没有提供足够的代码来创建完美的复制+粘贴解决方案,但这是一个非常小巧的演示。请仔细检查它,并尽力将这些概念应用于您自己的代码。祝好运!!

JS Fiddle (with comments & console logs)

JS Fiddle (no comments)

Read about $.grep() at jQuery Docs