【发布时间】:2014-04-30 14:58:00
【问题描述】:
我的 json 对象和 getJSON() 之间有一个工作连接。我还可以使用这段代码对我得到的数据进行排序,我在数组的“名称”字段上对其进行了排序,它工作正常:
$.getJSON(url,function(json){
function sortJson(a,b){
return a.name > b.name? 1 : -1;
}
json.users.sort(sortJson);
$.each(json.users,function(i,row){
$("#output").append(
'<li>' + row.id + row.name + row.job + '</li>'
);
});
});
这是我的 json 数组:
{"users":[
{"id":"1","name":"John","job":"worker"}
{"id":"2","name":"Mike","job":"innovator"}
{"id":"3","name":"Anna","job":"reader"}
]}
我想要的是,当我单击一个按钮时,sortJson() 应该对另一个字段(如“id”或“job”)上的用户进行排序。我这样做了:
function sortJsonField(x){
var field = x;
var url="http://localhost/api/users.php";
$.getJSON(url,function(json){
function sortJson(a,b){
if(field == "id"){ return a.id > b.id? 1 : -1; }else
if(field == "job"){ return a.job > b.job? 1 : -1; }else
return a.name > b.name? 1 : -1;
}
json.users.sort(sortJson);
$.each(json.users,function(i,row){
$("#output").append(
'<li>' + row.id + row.name + row.job + '</li>'
);
});
});
}
它成功了,现在你应该想知道我的问题是什么。就是这样,每次我点击按钮执行sortJsonField('thefieldname')。它执行整个 $.getJSON,与 url 建立新连接并与后端通信。我不希望这样,它太慢了,服务器的工作量会很重。 我想获取一次 json,然后对数组进行排序(所以实际上只有我需要刷新的 $.each 函数)。但它不起作用。
有什么想法吗?
好的,我修改了代码,我想我真的很接近了:
<!DOCTYPE html><head>
<title>Users</title>
<script src="jquery-1.9.1.min.js"></script>
<script>
$(document).ready(function(){
var url="http://192.168.247.86/X/users.php";
var json = { users: [] };
//getting & storing
$.getJSON(url,function(response){
json = response;
});
//sorting
function sortJsonField(field){
alert(field);
function sortJson(a,b){
if(field == "id"){ return a.id > b.id? 1 : -1; }else
if(field == "job"){ return a.job > b.job? 1 : -1; }else
return a.name > b.name? 1 : -1;
}
json.users.sort(sortJson);
showJSON();
};
//showing
function showJSON(){
$.each(json.users,function(i,row){
$("#output").append(
'<li><em>' + row.id + '</em><br>' + row.name + '<br>' + row.job + '</li>'
);
});
};
});
</script>
</head>
<h1>Users</h1>
<button onClick="sortJsonField(Id)">Id</button>
<button onClick="sortJsonField('Name')">Name</button>
<button onClick="sortJsonField('Job')">Job</button>
<ul id="output"></ul>
</body>
</html>
这是我的 json:
{"users":[{"id":"1","name":"John","job":"Worker"},{"id":"2","name":"Mike","job":"Reader"},{"id":"3","name":"Mary","job":"Writer"},{"id":"4","name":"Angelo","job":"Player"},{"id":"5","name":"Kevin","job":"Doctor"},{"id":"6","name":"Zidane","job":"Player"}]}
现在可以使用了
<!DOCTYPE html>
<head>
<script src="jquery-1.9.1.min.js"></script>
<script>
$(document).ready(function() {
var url="http://localhost/X/users.php";
var json = new Array();
//getter
$.getJSON(url,function(data){
json = data;
}).done(function(){
sortJsonField();
$('#sortid').click(function(){
sortJsonField("id");
})
$('#sortname').click(function(){
sortJsonField("name");
})
$('#sortjob').click(function(){
sortJsonField("job");
})
});
function sortJsonField(field){
function sortJson(a,b){
if(field == "id"){ return a.id > b.id? 1 : -1; }else
if(field == "job"){ return a.job > b.job? 1 : -1; }else
return a.name > b.name? 1 : -1;
}
json.users.sort(sortJson);
showJSON();
};
//shower
function showJSON(){
$('#output').empty();
$.each(json.users,function(i,row){
$("#output").append(
'<li><em>' + row.id + '</em><br>' + row.name + '<br>' + row.job + '</li>'
);
});
};
showJSON();
});
</script>
</head>
<body>
<button id="sortid">Id</button>
<button id="sortname">Name</button>
<button id="sortjob">Job</button>
<div id="output"></div>
</body>
</html>
【问题讨论】:
-
我认为您应该以中间方式保存数据。此 storage 应该是显示数据的基础,并且您的排序功能仅适用于该存储。仅调用 load 函数来更新该存储。但是如果不看一下你的 html,很难给出一个更具体的例子。
-
我想我明白了。我从 $.getJSON 获得的数据应该存储在一个数组中,我应该显示和排序该数组,而不是直接检索到的数据。你是这个意思吗?顺便说一句,我的 html 只有一个
- 用于数据和一些脚本源引用。
-
是的,差不多。请参阅@Abimbola 的答案以了解一种方法,但我建议不要使用全局变量。另外,如果您打算实现很多这样的功能,请查看已建立的frameworks,因为 jQuery 在这里真的不是最好的选择。
-
我还在学习主要功能。稍后我可能会研究框架
标签: javascript jquery json sorting getjson