首页 > 解决方案 > 无法访问比 for 循环中的当前索引少或大一个索引的数组元素(即使它存在)

问题描述

我的对象 idAry 是一个元素数组,具有一个名为msisdn_id. 数组中有 4 个对象,当我遍历它们并且 Id 设置为与循环中的第二个 ID 相同时,它正确地找到它并落入 else 子句。但是,当我尝试访问数组中位置 +1 或 -1 的元素的 id 时,我得到一个错误,[Vue warn]: Error in v-on handler: "TypeError: Cannot read property 'msisdn_id' of undefined"我不知道为什么它没有被定义。我从字面上循环通过“左”一个。

我有这样的代码:

  for (let [index, val] of idAry.entries()) {
    console.log("index is:" + index);
    console.log("val[index].msisdn_id:" + val[index].msisdn_id);
    if(id == val[index].msisdn_id){
      console.log("id found:" + val[index].msisdn_id);
      if( index == 0 ){
        //no left button
        console.log("index == 0: " + val[index + 1].msisdn_id);
        this.rightId = val[index + 1].msisdn_id;
      }
      else if (index == (val.length - 1)) {
        //no right button
        console.log("else if: " + val[index - 1].msisdn_id);
        this.leftId = val[index - 1].msisdn_id;
      } 
      else {
        console.log("both LR: " + val[index - 1].msisdn_id + "," + val[index + 1].msisdn_id);
        this.leftId = val[index - 1].msisdn_id;
        this.rightId = val[index + 1].msisdn_id;
      }
      break;
    }
  }

输出看起来像:

length of ary is:4
TerminalProfileReport.vue?3387:400 index is:0
TerminalProfileReport.vue?3387:401 val[index].msisdn_id:111
TerminalProfileReport.vue?3387:400 index is:1
TerminalProfileReport.vue?3387:401 val[index].msisdn_id:222
TerminalProfileReport.vue?3387:403 id found:222

编辑 - 更新了输出。它应该显示val[index]和更新的代码看起来像这样

    for (let [index, val] of idAry.entries()) {
    console.log("index is:" + index);
    console.log("idAry[index].msisdn_id:" + val.msisdn_id);
    if(id == val.msisdn_id){
      console.log("id found:" + val.msisdn_id);
      if( index == 0 ){
        //no left button
        console.log("index == 0: " + idAry[index + 1].msisdn_id);
        this.rightId = idAry[index + 1].msisdn_id;
      }
      else if (index == (idAry.length - 1)) {
        //no right button
        console.log("else if: " + idAry[index - 1].msisdn_id);
        this.leftId = idAry[index - 1].msisdn_id;
      } 
      else {
        console.log("both LR: " + idAry[index - 1].msisdn_id + "," + idAry[index + 1].msisdn_id);
        this.leftId = idAry[index - 1].msisdn_id;
        this.rightId = idAry[index + 1].msisdn_id;
      }
      break;
    }
  }

标签: javascriptarrays

解决方案


我不确定您发布的代码是否与您使用的代码相同,因为您提到的日志之一以: idAry[index].msisdn_id: while it's in question开头val[index].msisdn_id:。无论如何,基于问题中提到的代码,问题似乎在于如何使用变量val,因为它是数组本身。在每次迭代val中代表数组中一个条目的值idAry。在这里你的代码更新:

for (let [index, val] of idAry.entries()) {
    console.log("index is:" + index);
    console.log("idAry[index].msisdn_id:" + val.msisdn_id);
    if(id == val.msisdn_id){
      console.log("id found:" + val.msisdn_id);
      if( index == 0 ){
        //no left button
        console.log("index == 0: " + idAry[index + 1].msisdn_id);
        this.rightId = idAry[index + 1].msisdn_id;
      }
      else if (index == (idAry.length - 1)) {
        //no right button
        console.log("else if: " + idAry[index - 1].msisdn_id);
        this.leftId = idAry[index - 1].msisdn_id;
      } 
      else {
        console.log("both LR: " + idAry[index - 1].msisdn_id + "," + idAry[index + 1].msisdn_id);
        this.leftId = val[index - 1].msisdn_id;
        this.rightId = val[index + 1].msisdn_id;
      }
      break;
    }
  }

推荐阅读