怎么处理多层Json数据循环遍历的问题?看这里

简介: 怎么处理多层Json数据循环遍历的问题?看这里

今天我们写一个关于处理多层for循环的问题,其实这个严格来说不是多层循环的问题,他的本质其实是对Json数据格式的处理,很多时候啊我们的数据格式是这样的

数据格式:

var timeLineList=[{
    id: 0,
    title: '品质保证 ',
    iconName: '',
    messageList: [{
        mid: 0,
        mTxt: '平安保险承保',
        mStatus: '已确认'
    }, {
        mid: 1,
        mTxt: '官方授权',
        mStatus: '已确认'
    }, {
        mid: 2,
        mTxt: '正品保证',
        mStatus: '已确认'
    }, {
        mid: 3,
        mTxt: '3C认证',
        mStatus: '已确认'
    }]
},{
    id: 1,
    title: '售後服務 ',
    iconName: '',
    messageList: [{
        mid: 0,
        mTxt: '平安保险承保1',
        mStatus: '已确认'
    }, {
        mid: 1,
        mTxt: '官方授权1',
        mStatus: '已确认'
    }, {
        mid: 2,
        mTxt: '正品保证1',
        mStatus: '已确认'
    }, {
        mid: 3,
        mTxt: '3C认证1',
        mStatus: '已确认'
    }]
},{
    id: 2,
    title: '品质检测 ',
    iconName: '',
    messageList: [{
        mid: 0,
        mTxt: '平安保险承保2',
        mStatus: '已确认'
    }, {
        mid: 1,
        mTxt: '官方授权2',
        mStatus: '已确认'
    }, {
        mid: 2,
        mTxt: '正品保证2',
        mStatus: '已确认'
    }, {
        mid: 3,
        mTxt: '3C认证2',
        mStatus: '已确认'
    }]
},{
    id: 3,
    title: '售后电话 ',
    iconName: '',
    messageList: [{
        mid: 0,
        mTxt: '平安保险承保3',
        mStatus: '已确认'
    }, {
        mid: 1,
        mTxt: '官方授权3',
        mStatus: '已确认'
    }, {
        mid: 2,
        mTxt: '正品保证3',
        mStatus: '已确认'
    }, {
        mid: 3,
        mTxt: '3C认证3',
        mStatus: '已确认'
    }]
},{
    id: 4,
    title: '和我联系 ',
    iconName: '',
    messageList: [{
        mid: 0,
        mTxt: '平安保险承保4',
        mStatus: '已确认'
    }, {
        mid: 1,
        mTxt: '官方授权4',
        mStatus: '已确认'
    }, {
        mid: 2,
        mTxt: '正品保证4',
        mStatus: '已确认'
    }, {
        mid: 3,
        mTxt: '3C认证4',
        mStatus: '已确认'
    }]
}]

是吧,其实这样的数据是一个两层的数据,我在之前的博客里面写过,我说这种格式的数据其实是很常见的,但是今天为什么名字是处理多层for循环的问题呢?因为一般情况下这样的数据我们只要最内层的数据,也就是说后端将数据给我们,我们其实需要的只是最内层的那些数据,那么这样的话我们其实只需要将数据直接遍历就行了,不涉及多层循环取数据,但是我这里写的是要将数据展示成这样的形式:

如果你们仔细看数据的时候会发现这个数据是怎么展示的,他是将每一层的title作为一个遍历的对象,然后里面的每一层的里面的数据又是一次遍历,这样的数据怎么处理呢?今天我们写五种办法处理:

分析一波

没写之前我们首先分析一下这样的数据我们拿到以后应该以一种什么样的思路来处理。首先我们拿到数据第一步是看数据的特点,其实不管什么数据,只要是数据库创建的,他的数据都是有一定规律的,因为不可能说数据全是随机数生成的吧,那么数据库的数据怎么维护呢?是不是,特别是json格式的数据,既然是处理遍历,我们首先要知道数组的长度,那么他是两层的数据,我们拿那一层的长度呢?记住一个准则,分析问题的时候,由外往内分析,意思是先看最外层的长度,这人力说一下原因,因为其实循环的原理我们都知道,他是将满足条件的第一层全部走完,才会走第二层,举个最简单的例子:9*9乘法表,我们下面写一下:

for( var i=1;i<=9;i++){
    for(var j=1;j<=i;j++){
      document.write(j+"*"+i+"="+i*j+"&nbsp");
        }
      document.write("<br/>")
    }

我们可以看到,他是走完i=1的循环才会接着走i=2的情况,可能有人说这不是废话吗?是的,但是很多人理解这句话,就是不会用他的原理处理多层数据的问题,到这里其实我们就明白了,数据出来以后他是先走完最外层的第一个满足条件的数据,下面我画一个:

哈哈,画的太差,只是为了让你们可以看的明白,这里说一下,第一个条件不执行结束,循环是不会执行条件2的,那么这样的话,我们内层循环的时候可以直接写循环,不会影响外层的条件2,所以说json多层数据获取的问题就知道怎么处理,下面写代码。

for循环最常规的写法是下面是这样的:

$(document).ready(function(){
        console.log(timeLineList.length)
        for(let i = 0;i<timeLineList.length;i++){
          let outer = '<div class = "outer">'+timeLineList[i].title+'</div>';
          $("#mainbody").append(outer);
          let code = timeLineList[i].messageList;
          console.log(code.length);
          for(let j = 0;j<code.length;j++){
            let core = '<div>'+code[j].mTxt+'</div>'
            $("#mainbody").append(core);
          }
        }
      }); 

还有很多人喜欢这样写:

$(document).ready(function(){
        for(let i in timeLineList){
          let outer = '<div class = "outer">'+timeLineList[i].title+'</div>';
          $("#mainbody").append(outer);
          let code = timeLineList[i].messageList;
          for(let j in code){
            let core = '<div>'+code[j].mTxt+'</div>'
            $("#mainbody").append(core);
          }
        }
      })

用forEach循环也是一样可以实现的:

 $(document).ready(function(){
         timeLineList.forEach(i=>{
          let outer = '<div class = "outer">'+i.title+'</div>';
          $("#mainbody").append(outer);
          let code = i.messageList;
          code.forEach(j=>{
            let core = '<div>'+j.mTxt+'</div>'
            $("#mainbody").append(core);
          })
        }) 
      })

还有一种不是很常规的写法:

$(document).ready(function(){
        timeLineList.map(i=>{
          let outer = '<div class = "outer">'+i.title+'</div>';
          $("#mainbody").append(outer);
          let code = i.messageList;
          code.map(j=>{
            let core = '<div>'+j.mTxt+'</div>'
            $("#mainbody").append(core);
          })
        })
      }) 

那么其实ES6还有一种新的写法:

 $(document).ready(function(){
        for(let i of timeLineList){
          let outer = '<div class = "outer">'+i.title+'</div>';
          $("#mainbody").append(outer);
          let code = i.messageList;
          for(let j of code){
            let core = '<div>'+j.mTxt+'</div>'
            $("#mainbody").append(core);
          }
        }
       }) 

ok,到这里怎么处理这种情况的数据相信你们应该是可以有点思路了,下面我说一下用Jquery+Ajax将后端的这些json拿到:

$.ajax({
               type: "post",
               url: "接口名字",
               async: false,
               success: function (data) {
               if (data.code == 200) {
               for (let i in timeLineList) {
                let outer = '<div class = "outer">'+timeLineList[i].title+'</div>';
                $("#mainbody").append(outer);
                let code = timeLineList[i].messageList;
                console.log(code.length);
            for(let j = 0;j<code.length;j++){
                let core = '<div>'+code[j].mTxt+'</div>'
                $("#mainbody").append(core);
                            }
                         }
                      }
                        },
          error : function(data){
            alert(data.message);
            }
             });

其实我在之前是写过关于ajax处理数据的博文的,感兴趣的可以翻一下!

下面是全部源码:

<!DOCTYPE html>
<html lang="en">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <script src="js/code.js"></script>
    <style type="text/css">
        .code-examples-content {
            border-radius: 0 0 2px 0;
            padding: 0 18px 15px;
            padding-top: 1rem;
        }
        .mu-timeline-item {
            position: relative;
            height: 40px;
            margin-left: 45px;
        }
        .mu-timeline-item-line {
            position: absolute;
            height: 100%;
            top:6px;
            border:1px solid rgba(172, 172, 172, 0.37);
            left: 2px;
        }
        .mu-timeline-item-icon {
            position: absolute;
            box-sizing: border-box;
            background-color: #fff;
            top:6px;
        }
        .mu-timeline-item-content {
            position: relative;
            padding-bottom: 20px;
        }
        .solidStyle{
            border-radius: 50%; border: 1px solid #ACACAC; width: 3px; height: 3px;
        }
        .timeline-left-style{
            width: 50%;float: left;font-size: 1.2rem;
        }
        .timeline-right-style{
            color: #E31436;
            width: 50%;
            text-align: right;
            float: right;
            position: absolute;
            right: 5%;
            font-size: 1.3rem;
        }
        .font-light-style{
            color: #ACACAC;
            font-size: 0.8rem;
        }
    </style>
    <script type="text/javascript">
        window.onload = function () {
            timeLineStyle();
            function timeLineStyle() {
                if(timeLineList && timeLineList.length>0){
                    timeLineList.map((ret,index)=>{
                        if(ret.id==index){
                            let title_div='<div class="code-examples-content">' +
                                '<div style="float:left; margin-right:7px;">' +
                                /*'<ion-icon  name='+ret.title+' class="iconfont serIconStyle"></ion-icon>' +*/
                                '<img style="width:1.8rem;"  src="">' +
                                '</div>' +
                                '<div style="color:#151515;font-size:1rem;font-weight: bold;" class=""> '+ret.title+'</div>' +
                                '</div>';
                            $("#zId").append(title_div);
                            let msgList = ret.messageList;
                            if(msgList && msgList.length>0){
                                msgList.map((val,i)=>{
                                    let m_div ='<div class="mu-timeline-item" id="lineVal">' +
                                        '<!--线-->' +
                                        '<div  id="line_'+i+'_'+index+'" class="mu-timeline-item-line"></div >' +
                                        '<!--圆圈-->' +
                                        '<div class="mu-timeline-item-icon">' +
                                        '<div class="solidStyle"></div>' +
                                        '</div>' +
                                        '<div class="mu-timeline-item-content"' +
                                        'style="left:15px;">' +
                                        '<div class="mu-timeline-item-time">' +
                                        '<div class="timeline-left-style font-light-style">'+val.mTxt+'</div>' +
                                        '<div class="timeline-right-style">' +
                                        '<div style="font-size:0.9rem;float: right;line-height:19px;" class="fontThreeSize">'+val.mStatus+'</div>' +
                                        '<!--<div style="float: left;width: 50%;text-align: right">' +
                                        '<ion-icon name="check" class="iconfont checkStyle"></ion-icon>' +
                                        '</div>' +
                                        '<div style="float: right;width: 50%;text-align: right"> {{i.mStatus}}</div>-->' +
                                        '</div>' +
                                        '</div>' +
                                        '<!--<div  class="mu-timeline-item-des">\n' +
                                        '<span >发起第一个pr</span>\n' +
                                        '</div>-->' +
                                        '</div>' +
                                        '</div>';
                                    $("#zId").append(m_div);
                                    if(i==msgList.length-1){
                                        let styleVal = document.getElementById('line_'+i+'_'+index);
                                        if(styleVal){
                                            styleVal.style.display='none'
                                        }
                                    }
                                })
                            }
                        }
                    })
                }
            }
        }
    </script>
</head>
<body>
<div  id="zId" class="bgColor-white" style="height: 100%">
</div>
</body>
</html>

鄙人能力有限,写的可能哪里是有问题的,但是写过的代码都是我测试的,目前没有发现什么问题,如果您有更好的处理办法或者有更好的写法,可以随时联系我,一起交流。

谢谢阅读

相关文章
|
3天前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
18 1
|
1月前
|
JSON 前端开发 JavaScript
|
4天前
|
JSON JavaScript 数据格式
vue写入json数据到文本中+vue引入cdn的用法
vue写入json数据到文本中+vue引入cdn的用法
|
2天前
|
JSON 数据格式
Blob格式转json格式,拿到后端返回的json数据
文章介绍了如何将后端返回的Blob格式数据转换为JSON格式,并处理文件下载和错误提示。
7 0
Blob格式转json格式,拿到后端返回的json数据
|
29天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
17天前
|
JSON JavaScript 前端开发
Haskell中的数据交换:通过http-conduit发送JSON请求
Haskell中的数据交换:通过http-conduit发送JSON请求
|
1月前
|
存储 JSON JavaScript
|
1月前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
1月前
|
JSON 前端开发 API
【淘系】商品详情属性解析(属性规格详情图sku等json数据示例返回参考),淘系API接口系列
在淘宝(或天猫)平台上,商品详情属性(如属性规格、详情图、SKU等)是商家在发布商品时设置的,用于描述商品的详细信息和不同规格选项。这些信息对于消费者了解商品特性、进行购买决策至关重要。然而,直接通过前端页面获取这些信息的结构化数据(如JSON格式)并非直接暴露给普通用户或开发者,因为这涉及到平台的商业机密和数据安全。 不过,淘宝平台提供了丰富的API接口(如淘宝开放平台API),允许有资质的开发者或合作伙伴通过编程方式获取商品信息。这些API接口通常需要注册开发者账号、申请应用密钥(App Key)和秘钥(App Secret),并遵守淘宝的API使用协议。
|
1月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
47 1