我编写了这个相对简单的代码,以找到排序数组中应插入值的点。

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/

我不知道这对您来说不是一个重要问题,但是您也可以考虑如果值相等,会发生什么。应该在插入之前还是之后。如果要在使用>=之前使用它,否则使用>

但是正如一些评论员所说,如果对数组进行排序,就会有一些更好,更快的算法,例如二进制搜索(也很容易实现)。

09-26 19:18
查看更多