json数组遍历修改属性值报Cannot read property 'rank' of undefined?

请教大佬们,我for in遍历修改json数组会报undefined错误,可以帮忙看看问题出在哪吗?

var res = await mysql('cMyStarInfo').where('open_id', id).orderBy('Djlsh', 'desc');
for(i in res){
  //var newRes = res[i];
  var a = res[i].PenName;
  var b = await mysql('cPenInfo').where('penName', a);
  var c = await mysql('cCoures_list').where('penName', a).orderBy('Djlsh', 'desc');;
res[i].rank = b[0].rank
res[i].PenImgUrl = b[0].roundImgUrl
res[i].StarSum = b[0].starSum
res[i].upCourTitl = c[0].couTitle   
}
ctx.state.data = res


clipboard.png

另外当我不进行for循环时是有数据的

  var res = await mysql('cMyStarInfo').where('open_id', id).orderBy('Djlsh', 'desc');
  var a = res[0].PenName;
  var b = await mysql('cPenInfo').where('penName', a);
  var c = await mysql('cCoures_list').where('penName', a).orderBy('Djlsh', 'desc');
  res[0].rank = b[0].rank
  res[0].PenImgUrl = b[0].roundImgUrl
  res[0].StarSum = b[0].starSum
  res[0].upCourTitle = c[0].couTitle  

  ctx.state.data = res 
  
 

clipboard.png

阅读 2.7k
4 个回答

你不能打印一下rank嘛 rank为空 那就是 undefined咯

返回的数据贴出来啊

感觉上是你b[0]那里的rank可能没有定义,或者获取语法不对
你可以分步骤调试检测一下到底是哪里有问题。

如果你的res获取到的是一个数组,且想要改变数组中数据对象的值或扩展,建议使用:

// 或 res.map 得到新的数组
res.forEach(item => {
    // 判断当前数组节点是否有效
    if(!item) return;
    // 你的数据处理代码
    ...
});
// 得到修改后的res

尽量不要对数组进行fo..in循环[推荐for、for..of、和数组接口],因为数组也是一个对象,也是可以添加非数组索引字段的,如:

const ar = [{id: 23}];
ar.b = undefind;
//这时ar.length任然为1;
for (var k in ar) console.info(k); 
// 你将会得到一个额外的对象索引
// => 0,b
// 当你的k==='b'的时候,你的引用将会报出undefined;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题