簡體   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