【问题标题】:Simple iteration of nested JSON object嵌套 JSON 对象的简单迭代
【发布时间】:2020-10-15 10:02:24
【问题描述】:

我在迭代一个简单的嵌套 json 时遇到了很大的困难。出于某种原因,我似乎无法获得我想要的输出。我正在寻找迭代:

{
    "onShift": {
       "fastTrack1": {
         "name": "Bob, bob",
         "shift": "7a-7p",
         "service": "Fasttrack",
         "spectra": "722413",
         "office": "",
         "cell": ""
       },
       "fastTrack2": {
         "name": "Bill, Bill",
         "shift": "7a-7p",
         "service": "Fasttrack2",
         "spectra": "54827",
         "office": "",
         "cell": "123-456-9090"
       },
      
       "incoming": {
         "incoming_fastTrack1": {
           "name": "Billy, Bob",
           "shift": "7p-7a",
           "service": "Fasttrack",
           "spectra": "54821",
           "office": "",
           "cell": "123-456-8909"
       },
       "incoming_fastTrack2": {
         "name": "Funny, Bob",
         "shift": "7p-7a",
         "service": "Fasttrack2",
         "spectra": "3478",
         "office": "",
         "cell": ""
       },
      
       "shiftEnd": {
         "ended_E_MD": {
           "name": "Kissy Bob",
           "shift": "7a-3p",
           "service": "Area E",
           "spectra": "3281",
           "office": "",
           "cell": "123-456-12345"
         },
         "ended_D_MD": {
           "name": "funky bob",
           "shift": "7a-3p",
           "service": "Area D",
           "spectra": "0003",
           "office": "",
           "cell": ""
         },
         "ended_DE_MD": {
           "name": "Jimmy, Bob",
           "shift": "10a-6p",
           "service": "Area D-E",
           "spectra": "0002",
           "office": "",
           "cell": ""
         },
         "ended_Tr_MD": {
           "name": "Jim, Bob",
           "shift": "8a-4p",
           "service": "Triage",
           "spectra": "0001",
           "office": "",
           "cell": ""
         }
       }
}

我尝试迭代的方式是这样的(我尝试过的多种方式之一):

$.getJSON("../data/json/erCall.json", function(data){
        for (var i in data['onShift']){
           
        var name = data['onShift'][i].name;
        var spec = data['onShift'][i].service;
        var shift = data['onShift'][i].shift;
        var cell = data['onShift'][i].cell;
        var off  = data['onShift'][i].office;
        
$("#dataTargetOnCall").append('<tr><td>'+name+'</td><td>'+service+'</td>...etc');
        }
     
    });

我也试过了:

 $.getJSON("../data/json/erCall.json", function(data){
            for (var i in data){
              for (var j in data[i]){
           
        var name = data[i]['onShift'].name;
        var spec = data[i]['onShift'].service;
        var shift = data[i]['onShift'].shift;
        var cell = data[i]['onShift'].cell;
        var off  = data[i]['onShift'].office;

...等等

我的意图是迭代“onShift”下的所有列表并将所有项目(大约 20 个)输出到一个表中。它基本上输出哪些医生正在轮班。我知道如何格式化 append() 函数,但这当然是在我能够从 JSON 中捕获数据之后。

接下来我可以尝试什么?

【问题讨论】:

  • 确保您的 json 格式有效
  • 我很确定它是。当它少一层(并且没有嵌套)并且格式相同时,它似乎可以正常工作。
  • 你可以看到这个stackoverflow.com/a/15268692/7528659,它为同样的问题提供了一个解决方案。
  • 你可以看到这个enter link description here,它为你的问题提供了一个解决方案。
  • (我很感激当一个新人被否决时令人沮丧 - 它确实发生了。但是,请不要在您的帖子中添加投票建议 - 读者不感兴趣,并给他们不相关的材料阅读。如果可以的话,保持帖子简洁。我不推荐它,但你可以在 cmets 中添加关于投票的想法。)

标签: javascript json loops iterator iteration


【解决方案1】:

这是一个真正干净的rubico方法

const data = {
  "onShift": {
    "fastTrack1": { "name": "Bob, bob", "shift": "7a-7p", "service": "Fasttrack", "spectra": "722413", "office": "", "cell": "" },
    "fastTrack2": { "name": "Bill, Bill", "shift": "7a-7p", "service": "Fasttrack2", "spectra": "54827", "office": "", "cell": "123-456-9090" },
  },
  "incoming": {
    "incoming_fastTrack1": { "name": "Billy, Bob", "shift": "7p-7a", "service": "Fasttrack", "spectra": "54821", "office": "", "cell": "123-456-8909" },
    "incoming_fastTrack2": { "name": "Funny, Bob", "shift": "7p-7a", "service": "Fasttrack2", "spectra": "3478", "office": "", "cell": "" },
  },
  "shiftEnd": {
     "ended_E_MD": { "name": "Kissy Bob", "shift": "7a-3p", "service": "Area E", "spectra": "3281", "office": "", "cell": "123-456-12345" },
     "ended_D_MD": { "name": "funky bob", "shift": "7a-3p", "service": "Area D", "spectra": "0003", "office": "", "cell": "" },
     "ended_DE_MD": { "name": "Jimmy, Bob", "shift": "10a-6p", "service": "Area D-E", "spectra": "0002", "office": "", "cell": "" },
     "ended_Tr_MD": { "name": "Jim, Bob", "shift": "8a-4p", "service": "Triage", "spectra": "0001", "office": "", "cell": "" }
  },
}

const { map } = rubico

map(map(agent => {
  console.log(agent)

  const {
    name, spectra, shift, cell, off,
  } = agent

  // $("#dataTargetOnCall").append('<tr><td>'+name+'</td><td>'+service+'</td>...etc');
}))(data)
&lt;script src="https://unpkg.com/rubico"&gt;&lt;/script&gt;

Documentation for map

免责声明:我是rubico的作者

【讨论】:

    【解决方案2】:

    你说的是json对象?因为它不是一个数组?无论如何,如果是这种情况,您需要围绕属性键而不是索引值构建 for 循环,如下所示:

    const yourObj = {one: {a: 'a', b: 'b'}, two: {a: 'a', b: 'b'} }
    
    const keys = Object.keys(yourObj);
    
    for (let i = 0; i < keys.length; i ++) {
        let a = yourObj[keys[i]].a
        let b = yourObj[keys[i]].b
    
        console.log(a,b)
    }
    

    编辑:重写你的对象

    const objt = {
        "onShift": {
            "fastTrack1": {
                "name": "Bob, bob",
                "shift": "7a-7p",
                "service": "Fasttrack",
                "spectra": "722413",
                "office": "",
                "cell": ""
            },
    
            "fastTrack2": {
                "name": "Bill, Bill",
                "shift": "7a-7p",
                "service": "Fasttrack2",
                "spectra": "54827",
                "office": "",
                "cell": "123-456-9090"
            },
          
            "incoming": {
                "incoming_fastTrack1": {
                    "name": "Billy, Bob",
                    "shift": "7p-7a",
                    "service": "Fasttrack",
                    "spectra": "54821",
                    "office": "",
                    "cell": "123-456-8909"
                },
    
                "incoming_fastTrack2": {
                    "name": "Funny, Bob",
                    "shift": "7p-7a",
                    "service": "Fasttrack2",
                    "spectra": "3478",
                    "office": "",
                    "cell": ""
                },
          
                "shiftEnd": {
                    "ended_E_MD": {
                        "name": "Kissy Bob",
                        "shift": "7a-3p",
                        "service": "Area E",
                        "spectra": "3281",
                        "office": "",
                        "cell": "123-456-12345"
                    },
    
                    "ended_D_MD": {
                        "name": "funky bob",
                        "shift": "7a-3p",
                        "service": "Area D",
                        "spectra": "0003",
                        "office": "",
                        "cell": ""
                    },
    
                    "ended_DE_MD": {
                        "name": "Jimmy, Bob",
                        "shift": "10a-6p",
                        "service": "Area D-E",
                        "spectra": "0002",
                        "office": "",
                        "cell": ""
                    },
    
                    "ended_Tr_MD": {
                        "name": "Jim, Bob",
                        "shift": "8a-4p",
                        "service": "Triage",
                        "spectra": "0001",
                        "office": "",
                        "cell": ""
                    }  
                }
            }
        }
    }
    

    【讨论】:

    • 查看您的答案并查看我的代码后,我意识到我将 JSON 误认为是一个嵌套对象,而实际上它是一个数组。这引出了一个新问题:如何动态创建一个嵌套对象,使其包含所有列表?当我尝试它时,只显示单个第一次迭代。我似乎无法弄清楚如何创建一个包含多个对象的嵌套对象。
    • 我认为您的嵌套可能没有按照您希望的方式组织(仍然存在语法错误)。我建议绘制对象层次结构的树形图,然后仔细重写嵌套以匹配。
    • 我重写了嵌套;是在根层中将 onShift 作为单个属性的预期层次结构,然后是 fastTrack1、fastTrack2 和第一个嵌套层中的传入,然后是传入?
    【解决方案3】:

    由于您的数据结构是无逻辑嵌套的,因此最好的方法是使用中间表来引用您的目标元素

    const data = 
      { onShift: 
        { fastTrack1: { name: 'Bob, bob',   shift: '7a-7p', service: 'Fasttrack',  spectra: '722413', office: '', cell: '' } 
        , fastTrack2: { name: 'Bill, Bill', shift: '7a-7p', service: 'Fasttrack2', spectra: '54827',  office: '', cell: '123-456-9090' } 
        , incoming: 
          { incoming_fastTrack1: { name: 'Billy, Bob', shift: '7p-7a', service: 'Fasttrack',  spectra: '54821', office: '', cell: '123-456-8909' } 
          , incoming_fastTrack2: { name: 'Funny, Bob', shift: '7p-7a', service: 'Fasttrack2', spectra: '3478',  office: '', cell: '' } 
          , shiftEnd: 
            { ended_E_MD:  { name: 'Kissy Bob',  shift: '7a-3p',  service: 'Area E',   spectra: '3281', office: '', cell: '123-456-12345' } 
            , ended_D_MD:  { name: 'funky bob',  shift: '7a-3p',  service: 'Area D',   spectra: '0003', office: '', cell: '' } 
            , ended_DE_MD: { name: 'Jimmy, Bob', shift: '10a-6p', service: 'Area D-E', spectra: '0002', office: '', cell: '' } 
            , ended_Tr_MD: { name: 'Jim, Bob',   shift: '8a-4p',  service: 'Triage',   spectra: '0001', office: '', cell: '' } 
            } 
          } 
        } 
      } 
    const
      onShiftTarget =
        [ 'fastTrack1'
        , 'fastTrack2'
        , 'incoming/incoming_fastTrack1'
        , 'incoming/incoming_fastTrack2'
        , 'incoming/shiftEnd/ended_E_MD'
        , 'incoming/shiftEnd/ended_D_MD'
        , 'incoming/shiftEnd/ended_DE_MD'
        , 'incoming/shiftEnd/ended_Tr_MD'
        ]
        
    for( let st of onShiftTarget)
      {
      let target = st.split('/').reduce((a,c)=>a[c], data.onShift)
    
      console.log( target.name, target.shift ,  target.service )
      }

    【讨论】:

      【解决方案4】:

      查看所有答案并查看我的代码后,我意识到我将 JSON 误认为是一个嵌套对象,而实际上它是一个数组。这引出了一个新问题:

      如何动态创建一个嵌套对象以使其包含所有列表?当我尝试它时,只显示单个第一次迭代。

      我似乎不知道如何创建一个包含多个对象的嵌套对象。

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 1970-01-01
        • 2021-10-23
        • 2019-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 2021-05-19
        相关资源
        最近更新 更多