1

我正在构建一个基于两个 Google API 的 jQuery 搜索建议脚本。每个 API 都会输出一个“相关性”整数(我将在每个项目旁边返回以进行演示),并且我希望能够按每个项目的该整数对结果进行排序。

我怎样才能做到这一点?我尝试让脚本将所有内容输出到一个变量中,但我无法完全解决。

可以在这里看到一个工作演示:http: //jsfiddle.net/rEPf3/

我的 jQuery 代码是:

$(document).ready(function(){
    $("#search").keyup(function(){
        $.getJSON("http://suggestqueries.google.com/complete/search?q="+$("#search").val()+"&client=chrome&callback=?",function(data){
            var suggestion="";
            for(var key in data[1]){
                if(data[4]["google:suggesttype"][key]=="NAVIGATION"){
                suggestion+="<li><a href='"+data[1][key]+"'>"+data[2][key]+"</a> <i>("+data[4]["google:suggestrelevance"][key]+")</i></li>";
                }else{
                suggestion+="<li>"+data[1][key]+" <i>("+data[4]["google:suggestrelevance"][key]+")</i></li>";
                }
            }
            $("#suggest").html(suggestion);
        });
        $.getJSON("https://www.googleapis.com/freebase/v1/search?query="+$("#search").val()+"&limit=3&encode=html&callback=?",function(data){
            var suggestion2="";
            for(var key in data.result){
                suggestion2+="<li>"+data.result[key].name+" <i>("+data.result[key].score*4+")</i></li>";
            }
            $("#suggest2").html(suggestion2);
        });
    });
});
4

4 回答 4

1

这是您的完整代码,您必须将所有结果附加到一个容器并在.ajaxComplete事件中排序

$(document).ready(function () {
    $("#search").keyup(function () {
        $("#suggest").empty();
        $.getJSON("http://suggestqueries.google.com/complete/search?q=" + $("#search").val() + "&client=chrome&callback=?", function (data) {
            var suggestion = "";

            for (var key in data[1]) {
                if (data[4]["google:suggesttype"][key] == "NAVIGATION") {
                    suggestion += "<li><a href='" + data[1][key] + "'>" + data[2][key] + "</a> <i>(" + data[4]["google:suggestrelevance"][key] + ")</i></li>";
                } else {
                    suggestion += "<li>" + data[1][key] + " <i>(" + data[4]["google:suggestrelevance"][key] + ")</i></li>";
                }
            }
            $("#suggest").append(suggestion);
        });
        $.getJSON("https://www.googleapis.com/freebase/v1/search?query=" + $("#search").val() + "&limit=3&encode=html&callback=?", function (data) {
            var suggestion2 = "";
            for (var key in data.result) {
                suggestion2 += "<li>" + data.result[key].name + " <i>(" + data.result[key].score * 4 + ")</i></li>";
            }
            $("#suggest").append(suggestion2);

        });
        $(document).ajaxComplete(function (event, xhr, settings) {
            $("#suggest").html($("#suggest li").sort(function (a, b) {
                return (parseInt($(a).find("i").html(), 10) > parseInt($(b).find("i").html(), 10));

            }));
        });
    });
});

http://jsfiddle.net/rEPf3/8/

于 2013-06-03T12:07:43.077 回答
1

我认为最简洁的方法是将每个数据集的结果推送到一个外部范围的变量中,然后从中排序和渲染。示例如下。

var combined = [],
    completed = 0;

$(document).ready(function () {
    $("#search").keyup(function () {
        combined = [];
        completed = 0;
        $.getJSON("http://suggestqueries.google.com/complete/search?q=" + $("#search").val() + "&client=chrome&callback=?", function (data) {
            for (var key in data[1]) {
                if (data[4]["google:suggesttype"][key] == "NAVIGATION") {
                    combined.push({
                        href : data[1][key],
                        text : data[2][key],
                        score : parseInt(data[4]["google:suggestrelevance"][key],10)
                    });
                } else {
                    combined.push({
                        text : data[1][key],
                        score : parseInt(data[4]["google:suggestrelevance"][key],10)
                    });
                }
            }
            if ( ++completed == 2 ) complete();
        });
        $.getJSON("https://www.googleapis.com/freebase/v1/search?query=" + $("#search").val() + "&limit=3&encode=html&callback=?", function (data) {
            for (var key in data.result) {
                combined.push({
                    text : data.result[key].name,
                    score : parseInt(data.result[key].score,10) * 14
                });
            }
            if ( ++completed == 2 ) complete();
        });
    });
});


function complete(){
    console.log(combined);
    combined.sort(function(a,b){ return b.score - a.score; });
    var buffer = [];
    combined.forEach(function(result){
        buffer.push("<li>"+result.text+" <i>("+result.score+")</i></li>")
    })
    $("#suggest").html(buffer.join(""));
}

编辑

该解决方案没有考虑到用户可能以比 API 更快的速度键入,API 调用可能不会按顺序返回,并且没有做任何事情来尝试限制对每个 API。为了使这种行为更加一致(并且更有效):

  • 更改按键处理程序,以便每次按键取消任何先前的超时,然后以合理的延迟设置新的超时(300 毫秒似乎是一个合理的起点),然后触发 API 调用
  • 将每个 API 调用包装在立即执行的函数中,以便您可以在每次 API 调用时引用全局计数器的值。每次按键都增加计数器,并且不处理来自计数器不匹配的 API 调用的响应
于 2013-06-03T12:37:11.537 回答
0

像这样试试

在 for 循环之前添加这一行

data[4]["google:suggestrelevance"].sort();

看演示

更新

尝试使用单个变量组合数据集

看演示

于 2013-06-03T12:24:49.600 回答
0

将它们放在一起并排序。

以下是代码。
使用promise 知道两个ajax 请求都完成了。

$(document).ready(function(){
    $("#search").keyup(function(){
        var mergedData = [];
    var promise1 = $.getJSON("http://suggestqueries.google.com/complete/search?q="+$("#search").val()+"&client=chrome&callback=?",function(data){
        var suggestion="";
        console.log(data);
        var arr  = [];
        for(var i in data[1]){
        arr[i] = {value : data[1][i], rel : data[4]['google:suggestrelevance'][i]};
        }

        $.extend(mergedData,arr);

        arr.sort(function(a, b){
            return (b['rel']-a['rel']);
        });


    });
    var promise2 = $.getJSON("https://www.googleapis.com/freebase/v1/search?query="+$("#search").val()+"&limit=3&encode=html&callback=?",function(data){
        console.log('data of second request', data);
        var suggestion2="";
        var arr = [];
        for(var key in data.result){
            arr[key] = {value : data.result[key].name, rel : data.result[key].score};
        }
        $.extend(mergedData,arr);
        $("#suggest2").html(suggestion2);
    });



        $.when(promise1, promise2).then(function(){
             mergedData.sort(function(a, b){
            return (b['rel']-a['rel']);
        });
            var suggestion = '';
            for(var key in mergedData){
                suggestion+='<li>' + mergedData[key].value + ' ' + mergedData[key].rel + '</li>';
            }    
            $("#suggest").html(suggestion);
        });
    });



});

更新了工作 jsfiddle:http: //jsfiddle.net/rEPf3/13/

于 2013-06-03T12:28:58.900 回答