这是一个非常奇怪的问题。
我正在调用服务器端方法来返回按字母顺序排序的郊区数组。
当我直接点击终点时,订单是预期的。但是,当Jquery调用该方法时,它将以随机顺序返回...
我怀疑问题与jquery函数有关:
function updateSuburbs(suburb_selected,town_id)
{
var $suburbs = $("#mds_suburbs");
$suburbs.empty();
$suburbs.append($("<option></option>").attr("value", "").text('Loading...'));
url = '/api/rpc/delivery/engine/suburbs/town_id/' + town_id;
$.ajax({
type: 'GET',
async: true,
url: url,
dataType: "json",
success: function(responseObject){
$suburbs.empty();
$suburbs.append($("<option></option>").attr("value", "").text('Select your suburb'));
if (responseObject.status) {
if (responseObject.suburbs) {
$.each(responseObject.suburbs, function(value,key) {
$suburbs.append($("<option></option>").attr("value", value).text(key));
});
if (suburb_selected !== null && suburb_selected !== '')
{
$('#mds_suburbs').val(suburb_selected);
}
} else {
$suburbs.append($("<option></option>")
.attr("value", 0).text('No suburbs for this town...'));
}
} else {
$suburbs.empty();
$suburbs.append($("<option></option>").attr("value", "").text('Error locations suburb'));
}
}
});
}
EIDT:
进一步阅读和研究表明,实际上Chrome是自动排序对象数组......:S
服务器端输出:
客户端输出:
答案 0 :(得分:1)
这种数据结构在PHP中表示为数组可能会产生误导。但重要的是要注意,即使在PHP中,它们也不称为索引数组,数字索引从0开始,但关联数组。
这些转换为JSON中的非数组对象,同样也转换为JavaScript。非数组对象的属性在JavaScript中没有预定义的顺序,因此它们可能以不可预测的顺序出现,这可能与浏览器有关。
有关详细信息,请参阅"Does JavaScript Guarantee Object Property Order?"。
在PHP中,您可以将关联数组转换为索引数组:
而不是:
$suburbs = Array(
"5190" => "CBD",
"5823" => "Cloetsville",
"5984" => "De Zalze"
)
获取此结构:
$suburbs = Array(
0 => Array("code" => "5190", "name" => "CBD"),
1 => Array("code" => "5823", "name" => "Cloetsville"),
2 => Array("code" => "5984", "name" => "De Zalze")
)
您可以使用此PHP代码进行此转换:
foreach($suburbs as $key => $value) {
$result[] = ["code" => $key, "name" => $value];
}
$suburbs = $result;
...并像之前一样继续将其作为带有json_encode
的JSON输出。
在JavaScript中,您必须按如下方式更改$.each
回调:
$.each(responseObject.suburbs, function(i, value) {
$suburbs.append($("<option></option>")
.attr("value", value.code).text(value.name));
});