[英]InfernoJS/ReactJS - Why is my for loop returning the same index in my render?
[英]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);
}
這是您的一些問題:
var index;
該變量是不必要的,因為這是一個簡單的函數,您可以從for塊中返回。 這並不是完全不好的做法,因為在更復雜的函數中返回變量是很好的
var sortedArr
開始使用let
並在需要時使用轉譯器/打包器
arr.sort(function(a, b) {
通過箭頭功能縮短(再次,編譯器/打包器是您的朋友)
for (var i = 0; i < sortedArr.length; i++) {
將.length
緩存到變量中以降低性能
for(var i=0,n=sortedArr.length; i<n; i++)
if (sortedArr[i] > num) { index = sortedArr.indexOf(sortedArr[i]); } }
index
,所以索引將被以后的所有true條件覆蓋。 在這種情況下,第一個真實傳遞為40
,索引將設置為3
,但隨后循環將再次迭代並遇到50
,它也大於您的num
,因此index
將設置為4並最終被設置為回來 您有一個繼承問題,您將返回已排序數組而不是傳入數組的索引。 這意味着,返回的索引不再與參數相對應。
也許您沒有注意到這一點,因為您傳遞的參數似乎已經被排序,但是如果您的數組未預先排序並且您正在其中尋找索引,則這可能是一個重大的無提示錯誤。
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}`) }
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.