Jquery返回数组未排序

时间:2017-04-06 17:37:30

标签: javascript jquery

这是一个非常奇怪的问题。

我正在调用服务器端方法来返回按字母顺序排序的郊区数组。

当我直接点击终点时,订单是预期的。但是,当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

服务器端输出:

enter image description here

客户端输出:

enter image description here

1 个答案:

答案 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));
});