【问题标题】:Why do I get an endless loop using moment.js?为什么我使用 moment.js 得到一个无限循环?
【发布时间】:2021-08-31 09:40:10
【问题描述】:

我得到了以下字符串数组:

队列日期 =

[
  '2020-11', '2021-01',
  '2021-02', '2021-03',
  '2021-04', '2020-10',
  '2021-05', '2020-12',
  '2021-07'
]

现在我尝试使用以下代码对日期从 2020-10 到 2021-07 进行升序排序:

cohortsDates.forEach((month) => {
      for(var i = 0; i < cohortsDates.length; i++ ) {
        if(moment(cohortsDates[i+1]) < moment(cohortsDates[i])) {
          var swap = cohortsDates[i]
          cohortsDates[i] = cohortsDates[i+1]
          cohortsDates[i+1] = swap
          
        }
      }

    })

    console.log(cohortsDates)

但我得到的只是一个无限循环,排序后的数组永远不会打印出来。有人知道,我能做些什么来解决它?

【问题讨论】:

    标签: javascript for-loop foreach momentjs infinite-loop


    【解决方案1】:

    i === cohortsDates.length-1(即您正在查看 for 循环中的最后一项)时,您测试:

    if(moment(cohortsDates[i+1]) < moment(cohortsDates[i])) {
    

    其中cohortsDates[i+1] 将始终为undefined,因此小于之前的值。

    所以你交换它们并将cohortsDates[i]分配给cohortsDates[i+1]

    这会将cohortsDates.length 增加1,因此for 循环的结束条件不适用。

    你现在再次循环,cohortsDates[i+1] 仍然是undefined,所以它变成了无限的。


    JS 有一个built-in sort method 来执行此操作。不要重新发明轮子。

    【讨论】:

    • 我认为如果您有一个数组并将值分配给超出数组末尾的索引,那么某些人可能会感到惊讶,那么 length 属性数组自动更改为大于正在使用的最高索引。
    【解决方案2】:

    您并没有最有效的排序算法。排序时,应该使用javascript的array.sort:

    cohortsDates.sort((a, b) => moment(a) < moment(b) ? -1 : 1);
    

    sort 方法将遍历数组并调用您作为参数传递的函数,其中两个值作为参数。如果函数返回负数,则表示a 小于b,正数表示a 大于b

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多