【问题标题】:Does condition expression of for loop changes after each iteration?每次迭代后for循环的条件表达式是否会发生变化?
【发布时间】:2020-06-22 07:30:30
【问题描述】:

我正在尝试编写一个函数decreasingOrder,它接受一个正整数作为输入,并以降序返回其数字的array

例如,decreasingOrder(1234) 应该给 [4,3,2,1]

function decreasingOrder(n) {
  let unarr = [...`${n}`].map(i => parseInt(i)); //Unordered Array of Digits
  let oarr = []; //Ordered Array of Digits
  
  for(let j=0; j<unarr.length; j++){
  let max = Math.max.apply(Math, unarr);
  oarr.push(max);
  unarr.splice(unarr.indexOf(max), 1); //delete element from array
  }

  return oarr;
}

console.log(decreasingOrder(1234));
//Expected [4,3,2,1], Instead got [4,3]
  • 我认为,使用splice方法删除元素也会减少数量 迭代次数。
  • 我也尝试了delete 运算符,但得到了[4, NaN, NaN, NaN](因为Math.max([undefined]))。
  • 当我尝试在 condition 表达式中为 for 循环使用特定数字而不是 unarr.length 时,它工作正常!

所以当我使用splice 方法删除元素时,它会减少unarr.length,当我尝试使用delete 运算符保持unarr.length 不变时,它会给出NaN,我该怎么办?有没有其他方法可以写入相同的函数?我是 JavaScript 的初学者。

【问题讨论】:

  • 如果使用的是数字,不妨把数字当作字符串处理。
  • 您在使用splice时应谨慎。它将从实际数组中删除元素。所以数组的长度会发生变化。

标签: javascript arrays core-js


【解决方案1】:

您代码中的问题是unarr.splice(unarr.indexOf(max), 1) inside loop。

console.log(decreasingOrder(1234)) 为例。在第一个循环中,从数组中找到最大的数字并将其从数组中删除并推送到新数组。

在第一个周期结束时,输出将是 unarr = [1, 2, 3]oarr = [4]j=1

同样在第二个循环 unarr = [1, 2]oarr = [4, 3]j=2 之后。现在循环条件j &lt; unarr.length 不满足,因此循环中断。所以输出将是[4, 3]

相反,您可以使用以下实用程序来满足您的要求。

function decreasingOrder(n) {
  let unarr = [...`${n}`].map(i => parseInt(i)) //Unordered Array of Digits

  return unarr.sort((a,b) => b-a)
}

console.log(decreasingOrder(1234))

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多