【问题标题】:Javascript - Undefined arrays in iterationJavascript - 迭代中未定义的数组
【发布时间】:2019-01-01 19:51:41
【问题描述】:

我正在开发一个使用 API 的 Nodejs 工具。 我的问题是我不明白为什么数组的前一个元素没有正确注册并且在迭代器递增时是“未定义”。

  this.pptab = new Array();
  this.tabplayers = new Array();

  for (var i = 0; i < (argsname.length - 1); i++) {
    osuApi.getUser({ "u": argsname[i], "m": argsmode.join('=') }).then(user => { //calling the osu!api
      this.pptab[i] = user[0].pp_raw;
      this.tabplayers[i] = user[0].username;
      console.log("Player -1: " + this.tabplayers[i - 1]); // This displays "Undefined" in each iteration
    });
  }

【问题讨论】:

  • 您是否意识到,对于第一个迭代元素(在索引 0 处),表达式计算 -1 并将其用作访问的索引,并且尚未定义该索引处的元素?
  • 谢谢,我编辑了代码,使迭代器从 1 开始,我初始化了数组的第一个元素,但它仍然显示“未定义”...
  • @bastoo0 你仍然会遇到同样的问题,因为索引 [0] 也不会被定义
  • 只有在迭代不是第一次(在您的情况下)时才能访问this.tabplayers[i - 1] 的值
  • argsname 数组中包含什么?

标签: javascript arrays node.js


【解决方案1】:

循环条件[ i **&lt;** (argsname.length-1)] 中的两个问题一您不需要 (-1 ),因为条件较小。第二,如果第一步需要条件。

  this.pptab = new Array();
  this.tabplayers = new Array();

  for (var i = 0; i < (argsname.length); i++) {
    osuApi.getUser({ "u": argsname[i], "m": argsmode.join('=') }).then(user => { //calling the osu!api
      this.pptab[i] = user[0].pp_raw;
      this.tabplayers[i] = user[0].username;
      if(i>0) {
           console.log("Player -1: " + this.tabplayers[i-1]); // for first player -1 does not exist
      }
    });
  }

【讨论】:

  • 我故意使用 (argsname.length - 1) 因为我的数组有一个我不使用的元素。这是一个“Player1”“Player2”“Player3”“m=2”的数组,这就是我使用“argsname.length - 1”的原因。所以我尝试使用你的代码,但我仍然有这个问题,我开始认为这可能是因为“this”的使用不当
  • 是的,对象值的初始化应该没有 this 。根据“JavaScript 严格模式不允许默认绑定。因此,当在函数中使用时,在严格模式下,这是未定义的。”请参考“w3schools.com/js/js_this.asp
【解决方案2】:

我认为您在将字符串命令转换为数组然后将其移动时做错了。看到这个:

代码在这里: https://repl.it/@LatinWarrior/StackoverflowQuestion

这是我写的:

let argsname = "!topsetup Player1 Player2 Player3 m=2".split(' ');
let argsnameWithShift = argsname.shift();

console.log(argsname);
console.log(argsnameWithShift);

【讨论】:

  • prntscr.com/m1ylqi 这是我应该得到的吗?我不明白为什么在轮班之前我的第一个索引中没有“!topsetup”...
  • 我建议你在字符串的开头附加一个空字符串,你会得到你想要的,就像这样: let argsname = " !topsetup Player1 Player2 Player3 m=2".split(' ' ).shift();
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2018-05-14
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多