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

时间:2018-03-23 01:19:18

标签: javascript loops for-loop



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?
&#13;
&#13;
&#13;

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

在第二个中,当索引应该是索引2时,它也返回索引4?

4 个答案:

答案 0 :(得分:2)

你需要突破你的循环:

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

答案 1 :(得分:1)

即使找到第一个有效索引,你的循环也会运行。你可以在循环中返回index来打破,或者自己打电话等等。

答案 2 :(得分:0)

考虑的功能替代方案:)

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

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

答案 3 :(得分:0)

问题更正

以下是您的一些问题:

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

  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,这也比您的{更大{1}},因此num将设置为4并最终返回
    2. 这么多不必要的花括号
    3. 您有一个继承问题,即您要返回排序数组的索引,而不是您传入的数组。这意味着,返回的索引不再与参数对应。

      也许你没有注意到这一点,因为你传入的参数似乎已经被排序了,但如果你的数组没有预先排序并且你正在寻找它,这可能是一个主要的无声错误其中的索引。


      更好的写作方式:

      index
  6. 以下包括一些用于格式化日志输出的快速辅助函数(例如if( sortedArr[i] > num ) return arr.indexOf( sortedArr[i] ) )。这是不必要的,但如果您收到了预期的正确输出,则可以快速直观地扫描。此外,还添加了通用(基本)数字排序函数,以使代码更具可读性。我觉得这个函数是完全基本的,但是在你的代码中,每次调用log时都会重新定义函数,这是一种不必要的性能损失。

    更好的浏览器

    getIndexToIns

    Internet Explorer

    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}`)
    }