排序结果在JSON变量按整数
Ordering results in JSON variable by integer
我正在构建一个基于两个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);
});
});
});
我认为最干净的方法是将每个数据集的结果推入外部作用域变量,然后从中排序和呈现。示例如下:
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的调用数量。要使此行为更一致(和更有效):
- 更改按键处理程序,使每次按键取消任何先前的超时,然后设置一个新的超时在一个合理的延迟(300ms似乎是一个合理的地方开始),然后触发API调用
- 将每个API调用包装在一个立即执行的函数中,这样你就可以在每个API调用时引用全局计数器的值。每次按键都增加计数器,并且不处理来自计数器不匹配的API调用的响应
这是完整的代码,您必须将所有结果附加到一个容器中,并在.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/试一下
将前一行添加到for循环
data[4]["google:suggestrelevance"].sort();
看到演示
尝试使用单个变量
组合数据集看到演示
将它们放在一起并进行排序。
代码如下:
使用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/
相关文章:
- 限制javascript变量的最小/最大整数
- 如何在 Javascript 中将变量的值从字符串转换为整数
- 为什么可以对整数变量调用toString(),而不能对文字数字调用
- 将angular变量{{$index+1}}转换为javascript整数
- 将整数变量插入数据库
- 如何分离javaScript变量's整数和它's decimal以分别设置样式
- 如何传递一个整数来创建新的变量名
- 获取用于动态加载的整数变量的值
- 在 .click 上更改变量整数与 .load 耦合
- 为什么当我使用变量而不是整数或字符串时初始化日期对象失败
- Angularjs:即使在我将变量解析为整数之后,也会添加整数
- 登录以使用 jquery 滚动函数将整数变量从最小值增加到最大值
- 连接保存整数的变量
- 如何将整数变量从PHP传递到Javascript Google Chart API
- 如何在javascript中将整数变量转换为字符串
- 将HTTP请求中的所有变量视为整数(例外)
- 为什么JavaScript会将整数变量强制转换为字符串变量
- 如何将一个整数值传递给PHP整数变量中的JS
- 将JavaScript变量值分配给JSP整数变量
- 添加两个整数变量