zoukankan      html  css  js  c++  java
  • Ajax请求php返回json对象数据中包含有数字索引和字符串索引,在for in循环中取出数据的顺序问题


    //
    php中的数组数据格式 Array ( [all] => Array ( [title] => ALL [room_promotion_id] => all ) [best_available_rate] => Array ( [title] => Best Available Rate [room_promotion_id] => best_available_rate ) [30] => Array ( [room_promotion_id] => 30 [version] => 1 [date_from] => 2014-08-05 [date_to] => 2014-09-30 [night_no] => 1 [discount_stype] => 1 [discount_rate] => 10 [discount_night] => 0 [title] => Summer Discount - Premier Suite [summary] => <p> Bring your family along to relax in the Summer! Enjoy a 10% off whenever you book Premier Suite.</p> [before_day] => 0 ) )
    //json_encode()之后输出的数据,这也是ajax返回的json数据对象
    {"all":{"title":"ALL","room_promotion_id":"all"},
    "best_available_rate":{"title":"Best Available Rate","room_promotion_id":"best_available_rate"},
    "30":{"room_promotion_id":"30","version":"1","date_from":"2014-08-05","date_to":"2014-09-30","night_no":"1","discount_stype":"1",
    "discount_rate":"10","discount_night":"0","title":"Summer Discount - Premier Suite",
    "summary":"<p> Bring your family along to relax in the Summer! Enjoy a 10% off whenever you book Premier Suite.</p> ","before_day":"0"}}
    //javascript代码
    
    function ajaxPrmotion(){
        var check_in_hidden = $('#check_in_hidden').val();
        var check_out_hidden = $('#check_out_hidden').val();
        var adults_num = $('#adult').attr('selected','selected').val();
        var child_num  = $('#child').attr('selected','selected').val();
        var promotion_opt ='';
        var url= "reservation.php?action_type=mobile_ajax&check_in="+check_in_hidden+"&check_out="+check_out_hidden+"&adult="+adults_num+"&child="+child_num+"&upd=1";
        
        $.ajax({
            url:url,
            type : "get",
            dataType : "json",
            success: function(result) {
                //$("select[name=promotion_id]").find("option").remove().end().append("<option value='0'>__($lang_text.best_rate)__</option>");
                $("select[name=promotion_id]").find("option").remove();
                var promotion_opt ='';
                if (result!='' && result){
                    /×
                    使用for(var variablename in object){}循环出来的数据顺序与php中打印输出的数组中数据的顺序和json_encode()后的数据顺序是不同
                    最先循环取到的索引为30的数据,然后是all和best_available_rate,不知道这个究竟是怎么一回事。
                    因为在php中的数组中的顺序已经固定好了,json_encode()出来的数据也是和php数组中的顺序相同,但是为何在javascript中使用for in出来的数据
                    顺序反而不相同呢?只有两个原因: 1.jquery中对传输的json格式数据进行了排序吗?2.要么就是在for in发生的问题了
                   ×/
    for(var promotion in result){ promotion_opt += '<option value="' +result[promotion]["room_promotion_id"]+'">'+ result[promotion]["title"]+'</option>'; } } $("select[name=promotion_id]").append(promotion_opt); } }); }


    所以,我自己写一段javascript代码来进行测试,发现问题的原因是在javascript的for in上面.

    测试代码如下:

    <script type="text/javascript">
    
        var json_data = {"all":{"title":"all","room_promotion_id":"all"},
     "best_room_rate":    {"title":"best_room_rate","roompromotion_id":"best_room_rate"},
                                "30":{"title":"Summer Room rate" , "room_promotion_id":"30"}
                                };
                
    for(var promotion in json_data){
        alert(promotion);// 30->all->best_room_rate
    }
    </script>

    针对上面的代码,我将"30"这个数字修改为"summer rate",代码如下:

    <script type="text/javascript">
    var json_data = {"all":{"title":"all","room_promotion_id":"all"},
                                 "best_room_rate":{"title":"best_room_rate","roompromotion_id":"best_room_rate"},
                                "summer rate":{"title":"Summer Room rate" , "room_promotion_id":"30"}
                                };
                
    for(var promotion in json_data){
        alert(promotion);
    //这次循环输出的结果完全就是按照上面定义的json_data数据中顺序
    }
    </script>

    从上面的代码比较,我得出下面的结论,也许我的结论不一定是完全正确和合乎科学的。

    结论:当json格式数据中既有包含有数字索引和文字索引时,那么在for in循环中首先取出来必定是数字索引的数据,然后就是按顺序取出文字索引的数据。

  • 相关阅读:
    Codeforces1420E. Battle Lemmings 题解 动态规划
    C++使用partial_sum求前缀和
    HDU6171 Admiral 题解 折半搜索
    HDU3017 Treasure Division 题解 折半搜索
    使用re.split 按标点+空格的一种分割办法
    实现CString的Format功能,支持跨平台
    转载一篇makefile,说的很详细
    Microsoft C++ 异常: std::system_error std::thread
    源码一样,运行结果不一致的解决办法
    记录一次阿里的电话面试
  • 原文地址:https://www.cnblogs.com/shuman/p/3899824.html
Copyright © 2011-2022 走看看