2013-06-03 61 views
1

我正在構建一個基於兩個Google API的jQuery搜索建議腳本。每個API都會輸出一個「相關性」整數(我將在每個項目旁邊返回來演示),我希望能夠按每個項目的整數對結果進行排序。JSON變量整數排序結果

我該怎麼做?我試着把腳本輸出到一個變量,但我無法完成它。

的工作演示可以在這裏看到: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); 
     }); 
    }); 
}); 
+0

我對你要求的東西有點不清楚。我很抱歉,如果我很慢。你想將兩個數據集合併成一個組合集合嗎? –

+0

@RichardMarr我現在可以看到它有點不清楚,對不起!是的,這正是我想要做的,然後按括號中的值對它們排序。認爲你可以做到這一點? – user2036031

回答

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調用的響應,其中計數器不匹配
+0

謝謝,你能提供一個演示,所以我可以測試它嗎? – user2036031

+0

當然,只要將它粘貼到JSFiddle中即可:http://jsfiddle.net/rEPf3/2/我還要補充說,結合來自不同搜索索引的相關性分數是一個灰色區域。我假設你知道自己在做什麼並且正在冒險,但對那些沒有這樣做的人來說,你不能將這樣的相關分數合併爲期望嚴格的結果 –

+0

另外,請注意,我更改了相關乘數到14,所以你可以看到混合 –

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/

+0

當每個API轉到它自己的div和變量時,它不會對當前進行排序。我該如何分類? – user2036031

+0

@ user2036031:只需點擊jsfiddel更新的示例並搜索一些內容即可。結果在排序順序 –

+0

這裏沒有更新。你能給我一個新的鏈接嗎? – user2036031

0

嘗試這樣

之前將添加此行的for循環

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

See Demo

更新

嘗試通過使用單個可變

See Demo數據集組合

+0

這並沒有訂購任何東西。它們和以前完全一樣。 – user2036031

+0

@ user2036031你想要什麼類型的訂單解釋更多 – Dineshkani

+0

數字順序由括號中每個旁邊的值。儘管如上所述,兩個數據集需要先結合到Richard Marr。 – user2036031

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/

+0

它們以完全隨機的順序出現。您需要按照上述Richard Marr的說明合併兩個數據集。 – user2036031

+0

編輯來解決問題。排序功能不正確。 – Vishwanath

+0

仍然無法正常工作。他們的順序錯誤 - 他們需要從最大到最小。 – user2036031