【问题标题】:Never ending for within for loop在 for 循环中永远不会结束
【发布时间】:2016-06-21 14:11:53
【问题描述】:

我正在尝试将文本转换为二进制,但是当我的循环运行时,它永远不会结束。我不明白为什么会这样。

有没有更好的方法来做到这一点?

handleBinaryChange: function(e){
    var friendsCopy = this.state.friendsArray;
    for (var i = 0; i < friendsCopy.length; i++) {
        for (var j = 0; j < friendsCopy[i].friendsName.length; j++) {   
          console.log(friendsCopy[i].friendsName += friendsCopy[i].friendsName[j].charCodeAt(0).toString(2) + " ");
        }//End of 'j' for
      }//End of 'i' for

      this.setState({
          friendsArray: friendsCopy //make friendsCopy contain the new value for friendsName
      });
    }
}

【问题讨论】:

  • 你在你的 console.log 语句中增加了 friendsName,不是吗?
  • 另外,它不是friendsArray的副本,它是对原始数组的另一个引用。
  • 是不是在前一个值的基础上增加了新值?

标签: javascript for-loop reactjs


【解决方案1】:

通过在friendsCopy[i].friendsName += 中使用+=,您正在修改friendsCopy[i].friendsName。每次迭代它都会变长,所以它永远不会停止。

如果只想输出到控制台,改成

friendsCopy[i].friendsName + friendsCopy[i].friendsName[j].charCodeAt(0).toString(2) + " ");

【讨论】:

    【解决方案2】:

    您正在使用+=增加friendsName 值
    在每次循环迭代中

    简单的解决方案:使用存储起始值的辅助测试参数:
    这样,测试值在整个循环中是固定的
    例如:

    for(var i=0; i<friendsCopy.length; i++){
    
      var test = friendsCopy[i].friendsName.length; // added this param
      for(var j=0; j<test; j++){   // used it here
    
        console.log(friendsCopy[i].friendsName += friendsCopy[i].friendsName[j].charCodeAt(0).toString(2) + " ");
    
      }//End of 'j' for
    
    }//End of 'i' for
    

    【讨论】:

      【解决方案3】:

      您在中断条件中使用friendsName 的长度,但您不断增加循环内字符串的长度:

      for(var j=0; j<friendsCopy[i].friendsName.length; j++){   
          console.log(friendsCopy[i].friendsName += friendsCopy[i].friendsName[j].charCodeAt(0).toString(2) + " ");
      }
      

      请注意,friendsCopy[i].friendsName.length 将在循环的每次迭代中执行,而不仅仅是在开始时执行一次。

      【讨论】:

      • 我怎么只是重复他的代码?我指出他的错误在哪里以及他做错了什么。我坚信他能够自己解决这个问题,因为这应该是学习过程的一部分。
      • @Icepickle 是否有反对这种方法的规则?请指出。
      • @Icepickle 知道了。
      • @warkentien2 与其说是规则,不如说是not prefered
      • 所有,感谢您指出这一点。这也不是故意的,我真的不在乎成为第一个回答的人。后来我只是添加了一些我最初认为没有必要但似乎很有帮助的信息。以后我会尽量避免这种编辑! :-)
      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2011-01-20
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多