为什么forEach只跑出第一个值? 没办法打印出全部

假设有一个数组长这样

 var qq = [
  
  {
    "info": {"event": 123},
    "odds": 
    [
      {"o": ["test","123",],
        "oName": "超级联赛 冠军"
      },
      {"o": ["qq","ee",],
        "oName": "苏格兰"
      },
    ],
    "main": true,
  },
  {
    "info": {"event": 323},
    "odds": [
      {"o": ["jk","234"] ,
        "oName": "苏格兰"
      }
    ],
    "main": true,
  }
  ];

我想要打印出每一个oName

qq.forEach(function(item,i){
  
    console.log(item.odds.oName)
    //结果undefined
    
    console.log(item.odds[i].oName)
    //成功列出第一个"超级联赛 冠军",
    //然后显示"TypeError: Cannot read property 'oName' of undefined

  return

});


为什么没办法打印出全部的oName? 怎么解决呢?

阅读 6.3k
9 个回答

这样肯定不行啊,odds也是个数组,最简单粗暴的是双重循环:

qq.forEach((item,i)=>{
    if (item.odds) {
        item.odds.forEach((val,index)=>{
            console.log(val.oName)
        })
    }
});
哥们,for循环怎么样
          
           for(var i=0;i<qq.length;i++){
                for(var j=0;j<qq[i].odds.length;j++){
                console.log(qq[i].odds[j].oName);
                }
            }
            

clipboard.png

qq.forEach(item => {
  item.odds.forEach(val => { // odds是一个数组,所以还得forEach一次
    console.log(val.oName)
  })
})
  1. "odds"是个数组 console.log(item.odds.oName)肯定是undefined

2.

qq.forEach((item) => {  
      item.odds.forEach((childItem) => {
         console.log(childItem.oName) 
      })
});


qq.forEach(function(item) {
    if (item.odds.length > 0) {
        item.odds.forEach(function(items, index) {
            console.log(items.oName)
        })
    }
})

forEach只遍历了一层,而oName属性属于第二层
qq.forEach((item)=>{

item.adds.map((val)=>{
    console.log(val.oName)
})

})

首先可以看到,你这是一个错误的代码,在数组执行到第二次循环时,将出现undefined错误:

  • 第一次循环:item存在,i=0;可以输出item.odds[i].oName;也就是item.odds的第一个元素的oName;正确。
  • 第二次循环:item存在,i=1;可以输出item.odds[1].oName;也就是item.odds的第二个元素的oName;但是,item.odds只有一个元素,故出现undefined错误。

你的forEach里有个return,意思就是循环一次,就返回,不循环了

qq.forEach(function(item) {

if (item.odds.length > 0) {
    item.odds.forEach(function(items, index) {
        console.log(items.oName)
    })
}

})

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题