![](/img/trans.png)
[英]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.