js数组,对象和json格式的处理-js取表格数据,json格式异步请求

推荐一个网站,建议大家去看看怎样快速而优雅地遍历 JavaScript 数组

第一段

场景:php将数据取出便利到模版后,自己用js取出模版的数据,组装成json格式提交到一个控制器。比如代码如下:

<tbody>
     <tr>
        <td>15</td>
        <td>1</td>
        <td>1</td>
        <td>15</td>
     </tr>
     <tr>
        <td>16</td>
        <td>1</td>
        <td>1</td>
        <td>16</td>
     </tr>
     <tr>
        <td>17</td>
        <td>1</td>
        <td>1</td>
        <td>17</td>
     </tr>
     </tbody>
  • 取出数据的代码
// 取出标题部分
var thead = new Object();
      $("thead tr th").each(function(i){
         thead[i] = $(this).text();
     });
 console.log(thead);
// tbody
var datas = new Object();
$("tbody tr").each(function(i){
    datas[i] = new Object();
    datas[i]['id'] = $(this).children("td").eq(0).text();
    datas[i]['web_id'] = $(this).children("td").eq(1).text();
    datas[i]['game_id'] = $(this).children("td").eq(2).text();
    datas[i]['username'] = $(this).children("td").eq(3).text();
});
//                console.log(datas);
//                datas = JSON.stringify(datas);
//                console.log(datas);
//// 组装标题和内容
var data = new Object();
        data['thead'] = thead;
        data['datas'] = datas;
// ajax处理
$.ajax({
        type: "GET",
        url: "{{ url('excel') }}",
        data: data,
        dataType:'json',
        success: function (data) {
            alert(data.msg);
        }

    })

注意事项:
1。数组和对象使用介绍:数组和对象要预定义。而且一次预定义只能定义一维数组。
所以我们如果需要使用二维数组,就可以在内部再定义一个数组,然后赋值给外层数组。
2.数组或对象的使用选择:JSON.stringify(datas);是将对象转换成json格式。此处其实使用new Array;也可以取出数据。但是我们还是用对象比较符合需求
3.打印:数组活着对象的时候,我们打印可以使用console.log(datas),但是使用documen.write(datas)是不能打印数组对象的。我们如果打印具体某个值,使用这两种方式都可以


ajax请求处理

  • 在控制器里面打印ajax提交的数据
$request = $request->all();
 dd($request);
直接传递datas,控制器的到的数据
传递`JSON.stringify(datas)`的到的结果
把表单头部尾部都组装请求打印后结果

我有点困惑,为什么我传对象过去,的到的却是数组呢?还有,其实用不用dataType:'json',的到的结果都是一样的。但是此处使用了它,为什么传递的时候却是传递JSON.stringify(datas)的到的结果图的结果呢


  • 如果我们想获取tr或者td的条数,可以这样
var num = $("#example1 tbody tr").toArray();  //获取总记录条数
//    alert(num.length);

第二段

我发现我不能使用ajax请求去打印数据,因为控制器里面的excel是直接导出的一个结果,就相当于是返回给我我们数据。而ajax又不能接受处理文件这个数据。所以我此处用了post提交的方式

  • 先来看一个一维的数组提交
var jsPost = function(action, values) {
  var id = Math.random();
  document.write('<form id="post' + id + '" name="post'+ id +'" action="' + action + '" method="post">');
  for (var key in values) {
    document.write('<input type="hidden" name="' + key + '" value="' + values[key] + '" />');
  }
  document.write('</form>');  
  document.getElementById('post' + id).submit();
}
jsPost('b.html', {
  'username': 'zhangsan',
  'password': '123'
});

我又将第一次的代码做了修改
1.二维对象取值的时候,$(this).children("td").eq(1).text();这种方法不灵活,因为它是写死的。应该再用each遍历一次取值
2.对象遍历使用for(var key in value),
3.post传递的时候,要把行的个数传递过去,因为我们数组的形式传递的是一维数组,传递后还要拆分成二维数组打印

<script>
            $(function(){
            function excel(){
                var datas = new Object();
                $("#example1 tbody tr").each(function(i){
                    datas[i+1] = new Object();
                    $(this).children("td").each(function(j){
                       datas[i+1][j] = $(this).text();
                    });
                });

                datas[0] = new Object();
                $("#example1 thead tr th").each(function(i){
                    datas[0][i] = $(this).text();
                });

//                取出每一行的条数
                var num = $("#example1 thead tr th").toArray().length;

                var jsPost = function(action, v, num) {
                    var id = Math.random();
                    document.write('<form id="post' + id + '" name="post'+ id +'" action="' + action + '" method="post">');
                    document.write('<input type="hidden" name="_token" value="{{ csrf_token() }}">');
                    document.write('<input type="hidden" name="num" value="'+num+'">');
// 此处遍历可以根据文章头部推荐的文章做修改,但我这里是用的自己的方式
                    for (var k in v) {
                        for(var key in v[k]){
                            document.write('<input type="hidden" name="' + k+'_'+key + '" value="' + v[k][key] + '" />');
                        }
                    }
                    document.write('</form>');
                    document.getElementById('post' + id).submit();
                };
               jsPost("{{ url('/excel') }}", datas, num);
            }
        </script>
  • 控制器代码
$num = $request->input('num');   //接收的是一维数组,需要拆分
        $request = $request->except(['_token','num']);
        //把一维数组拆分成二维
        $datas = array_chunk($request,$num);
          \Excel::create('Filename', function($excel)use($datas) {

            $excel->sheet('Sheetname', function($sheet)  use($datas) {

                $sheet->fromArray($datas);

            });

        })->export('xls');
  • 代码

function excel(){
    var datas = new Object();
    $("#example1 tbody tr").each(function(i){
        datas[i+1] = new Object();
        $(this).children("td").each(function(j){
            datas[i+1][j] = $(this).text();
        });
    });
    datas[0] = new Object();
    $("#example1 thead tr th").each(function(i){
        datas[0][i] = $(this).text();
    });

//                取出每一行的条数
    var num = $("#example1 thead tr th").toArray().length;
    // var token = $("input[name='_token']").val();
    // console.log(token);
    //取出打印头
    var head = $(".content-header h1").text();

    var jsPost = function(action, v, num) {
        var id = Math.random();
        document.write('<form id="post' + id + '" name="post'+ id +'" action="' + action + '" method="post">');
        // document.write('<input type="hidden" name="num" value="'+token+'">');
        document.write('<input type="hidden" name="num" value="'+num+'">');
        document.write('<input type="hidden" name="head" value="'+head+'">');
        for (var k in v) {
            for(var key in v[k]){
                document.write('<input type="hidden" name="' + k+'_'+key + '" value="' + v[k][key] + '" />');
            }
        }
        document.write('</form>');
        document.getElementById('post' + id).submit();
    };
    jsPost('/excel', datas, num);
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容