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;
对我来说,它应该返回索引3而不是4,因为索引4中的数字是50,而我的num变量是35,它小于40(在索引3处)。我的逻辑错了吗?我似乎无法弄明白为什么。
在第二个中,当索引应该是索引2时,它也返回索引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)
以下是您的一些问题:
var index;
该变量是不必要的,因为这是一个简单的函数,您可以从for-block返回。这并非完全不好的做法,因为在更复杂的函数中返回变量是好的
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
,这也比您的{更大{1}},因此num
将设置为4并最终返回您有一个继承问题,即您要返回排序数组的索引,而不是您传入的数组。这意味着,返回的索引不再与参数对应。
也许你没有注意到这一点,因为你传入的参数似乎已经被排序了,但如果你的数组没有预先排序并且你正在寻找它,这可能是一个主要的无声错误其中的索引。
index
以下包括一些用于格式化日志输出的快速辅助函数(例如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}`)
}