我编写了这个相对简单的代码,以找到排序数组中应插入值的点。
function findInsertionIndex(array, value){
var i = 0
while(array[i]){
if(value<array[i].value) break
i++
}
return i
}
这段代码很好用,但是我想在数组上用indexOf替换它,以提高可读性和简洁性。我尝试了在外部范围的值:
var insertionIndex = array.findIndex(e=> e.value<value) || 0
有人可以指出缺少的内容吗?
可运行
function findInsertionIndex(array, value){
var i = 0
while(array[i]){
if(value<array[i].value) break
i++
}
return i
}
// Run the code
a = [{value:1},
{value:5},
{value:6},
{value:7},
{value:9},
{value:23},
{value:84}]
ind = findInsertionIndex(a, 15)
console.log(ind)
////////
// Try with indexOf
////////
a = []
value = 15
// Add a first item
ind = a.findIndex(e=> e.value<value)
ind = ind>0 ? ind : 0
a.splice(ind, 0, 3)
// Add a second item
ind = a.findIndex(e=> e.value<value)
ind = ind>0 ? ind : 0
a.splice(ind, 0, 5)
// Add a third item
ind = a.findIndex(e=> e.value<value)
ind = ind>0 ? ind : 0
a.splice(ind, 0, 4)
console.log(a)
最佳答案
那么,findIndex
方法到底是什么?
如果数组中的元素满足提供的测试功能,则findIndex()方法将返回数组中的索引。否则返回-1。
并且由于您检查数组值是否小于测试值(e.value < value
),因此它始终是它返回的第一个索引(即0
)。
要获得所需的内容,必须反转这样的逻辑:e.value > value
,然后等效于while循环。
您的索引分配(ind
)也需要更改,因为没有找到的含义是现在数组中没有更小的元素了(即值是最大的):ind = ind >= 0 ? ind : a.length
也许看看这个小提琴:https://jsfiddle.net/cLqf6vg8/
我不知道这对您来说不是一个重要问题,但是您也可以考虑如果值相等,会发生什么。应该在插入之前还是之后。如果要在使用>=
之前使用它,否则使用>
。
但是正如一些评论员所说,如果对数组进行排序,就会有一些更好,更快的算法,例如二进制搜索(也很容易实现)。