我有一个输入框,用户可以在其中键入搜索词。
<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()
}
});
}
答案 0 :(得分:2)
您的数组包含基于您在每个map()
中创建的结构的对象。
这些对象具有属性label
和value
。
您正在寻找不存在的a[1]
和b[1]
...这就是您未定义的原因
所以你的排序应该是查看这些对象的属性并比较实际值而不是indexOf()
combine.sort(function(a, b){
return b.value.toLowerCase() > a.value.toLowerCase();
});