如何按用户的搜索词对2个AJAX请求创建的连续数组进行排序?

时间:2016-01-15 23:16:39

标签: javascript jquery json ajax sorting

我有一个输入框,用户可以在其中键入搜索词。

<input type="text" class="searchbox" placeholder="Search here">

然后,我在幕后有2个AJAX请求,“GetMovies”和“GetGames”,它们根据用户的搜索词返回电影和游戏列表。当用户将他们的搜索词输入到输入框中时,该框的自动完成建议与这些AJAX请求具有相似的电影和游戏标题。

这是有效的,但自动填充建议没有理想的排序。目前,显示匹配游戏的列表,然后匹配的电影列表显示在游戏列表下方,无论电影标题是否与用户的搜索词匹配得比上面的任何游戏好得多。

所以我试图根据他们与用户搜索词的匹配程度来确定排序,无论其类型如何。我有一个数组combine,其中包含来自GetMovies和GetGames的AJAX结果,我尝试在将其显示为自动填充建议(下面的代码中已注释掉的部分)之前对其进行排序,但这会导致错误(“无法读取未定义的属性'indexOf',”无法读取未定义的属性'长度')。

请让我知道我做错了什么以及如何解决。谢谢。

var results1 = [];
var results2 = [];
var combine = [];

$(".searchbox").autocomplete({
    source: function(request, response) {   
        $.when(GetGames(request), GetMovies(request)
        ).done(function(){
            combine = results2.concat(results1);                  

            /* 
            combine.sort(function(a, b){
                return b[1].indexOf(request.term) - a[1].indexOf(request.term);
            });
            */

            response(combine);    
            }
        )
    }
});

function GetMovies(request) {
    return $.ajax({
        'url': 'http://www.omdbapi.com/?s=' + 
                request.term +
                '&type=movie&r=json',
        'dataType': 'json',
        'success': function(data) {
            var list = data.Search;

            results1 = $.map(list, function(v,i){
                return {
                    label: v.Title + ' (' + v.Year + ')',
                    value: v.Title
                };
            })
        }
    });
}


function GetGames(request) {              
    return $.ajax({
        type: "POST",
        url: "php/phpscript.php?search=" + request.term, 

        dataType: "xml", 
        success: function(xmlResponse) {                            
            results2 = $("Game", xmlResponse).map(function() {
                return {
                    value: $("GameTitle", this).text() + ", G " + ($.trim($("ReleaseDate", this).text()) || "(unknown date)")
                };
            }).get()                           
        } 
    });
}

1 个答案:

答案 0 :(得分:2)

您的数组包含基于您在每个map()中创建的结构的对象。 这些对象具有属性labelvalue

您正在寻找不存在的a[1]b[1] ...这就是您未定义的原因

所以你的排序应该是查看这些对象的属性并比较实际值而不是indexOf()

combine.sort(function(a, b){
    return b.value.toLowerCase() > a.value.toLowerCase();
});