繁体   English   中英

为什么看起来我的for循环未返回正确的索引?

[英]Why does it seem like my for loop is not returning the correct index?

 function getIndexToIns(arr, num) { var index; var sortedArr = arr.sort(function(a, b) { return a - b; }); for (var i = 0; i < sortedArr.length; i++) { if (sortedArr[i] > num) { index = sortedArr.indexOf(sortedArr[i]); } } return index; } console.log(getIndexToIns([10, 20, 30, 40, 50], 35)); //returns 4? console.log(getIndexToIns([10, 20, 30, 40, 50], 30)); //also returns 4? 

对我来说,它应该返回索引3,而不是4,因为索引4中的数字是50,而我的num变量是35,它小于40(在索引3中)。 我的逻辑错了吗? 我似乎不知道为什么。

在第二个中,它也返回索引4,何时索引应为索引2?

您需要打破循环:

for (var i=0 ; i< sortedArr.length; i++){
  if (sortedArr[i] > num){
    index = sortedArr.indexOf(sortedArr[i]);
    break;
  }
}

即使找到第一个有效索引,循环也会运行。 您可以在循环内返回索引以中断,或者自己调用中断等。

要考虑的功能替代方案:)

这将返回数组arr中第一个元素的索引,该索引严格大于数字num

function getIndexToIns(arr, num) {
    return arr.findIndex(e => e > num);
}

问题更正

这是您的一些问题:

  1. var index;
    该变量是不必要的,因为这是一个简单的函数,您可以从for块中返回。 这并不是完全不好的做法,因为在更复杂的函数中返回变量是很好的

  2. var sortedArr
    开始使用let并在需要时使用转译器/打包器

  3. arr.sort(function(a, b) {
    通过箭头功能缩短(再次,编译器/打包器是您的朋友)

  4. for (var i = 0; i < sortedArr.length; i++) {
    .length缓存到变量中以降低性能

    • 示例: for(var i=0,n=sortedArr.length; i<n; i++)
  5. if (sortedArr[i] > num) { index = sortedArr.indexOf(sortedArr[i]); } }

    1. 因为您不是从循环中返回index ,所以索引将被以后的所有true条件覆盖。 在这种情况下,第一个真实传递为40 ,索引将设置为3 ,但随后循环将再次迭代并遇到50 ,它也大于您的num ,因此index将设置为4并最终被设置为回来
    2. 这么多不必要的花括号
    3. 您有一个继承问题,您将返回已排序数组而不是传入数组的索引。 这意味着,返回的索引不再与参数相对应。

      也许您没有注意到这一点,因为您传递的参数似乎已经被排序,但是如果您的数组未预先​​排序并且您正在其中寻找索引,则这可能是一个重大的无提示错误。


      一种更好的编写方式:

       if( sortedArr[i] > num ) return arr.indexOf( sortedArr[i] ) 

以下内容包括一些用于格式化日志输出的快速帮助器功能(例如log )。 这不是必需的,但是是一种可视化扫描的快速方法,如果您收到的输出与预期的相符,则正确。 另外,添加了通用(基本) 数字排序功能,以使代码更具可读性。 我发现该函数完全是基本的,但是在您的代码中,每次调用getIndexToIns都在重新定义该函数,这是不必要的性能损失。


更好的浏览器

 const getIndexToIns = (arr, num) => arr.indexOf(arr.sort(numeric).find(v => v > num)) log('getIndexToIns([10, 20, 30, 40, 50], 40)', 4) log('getIndexToIns([10, 20, 30, 40, 50], 35)', 3) log('getIndexToIns([10, 20, 30, 40, 50], 30)', 3) function numeric(a, b) { return a - b } function log(s, ex) { console.log(`${s} = ${Function('return ' + s)()}`, ` // expected: ${ex}`) } 


IE浏览器

 log('getIndexToInsIE([10, 20, 30, 40, 50], 40)', 4) log('getIndexToInsIE([10, 20, 30, 40, 50], 35)', 3) log('getIndexToInsIE([10, 20, 30, 40, 50], 30)', 3) function getIndexToInsIE(arr, num) { return ( arr.indexOf(arr.sort(numeric).filter(function(v) { return v > num }).shift()) ) } function numeric(a, b) { return a - b } function log(s, ex) { console.log(`${s} = ${Function('return ' + s)()}`, ` // expected: ${ex}`) } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM