2016-08-02 105 views
0

我写了这个相对简单的代码来找到排序数组中应该插入值的点。替换索引的方法

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 

有人可以指出什么是缺少的?

Runnable接口

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)

+1

您在开发人员工具控制台中遇到什么错误? –

+0

没有错误,它只是产生错误的输出。 – user2662833

+0

我想你的意思是'e => e.value <值' – 4castle

回答

1

那么,什么是findIndex方法是什么呢?

如果数组中的元素满足提供的测试函数,则findIndex()方法返回数组中的索引。否则返回-1。

既然你检查数组值大于测试值(e.value < value)更小,它总是第一个索引(即0)它返回什么。

为了得到你想要的,你必须颠倒这样的逻辑:e.value > value,那么它就等于你的while循环。

您的索引分配(ind)需要也被改变,因为没有找到的意思是,现在有没有更小的元素在阵列中(即价值是最大的一个):

ind = ind >= 0 ? ind : a.length

也许看看这个小提琴:https://jsfiddle.net/cLqf6vg8/

我不知道这是否是你一个重要的问题,但你也可以想想,如果值相等,会发生什么情况。应该在之前还是之后插入。如果你想要使用>=,否则>

但正如一些评论家说,如果你的阵列是分类,也有一些更好,更快的算法,在那里像二进制搜索(也容易实现)。

+0

我编辑了runnable来阐明如何使用它。此更改不能解决问题。 – user2662833

+0

好的,问题是你还需要反转''ind''赋值的逻辑,我会将这一点加入到答案中。 – ScientiaEtVeritas

+0

我知道二进制搜索的可能性。我只想要一些容易阅读的东西,而不是很快,因为我通常不会在这个数组中有太多项目。 – user2662833

0

是不是因为<需求逆转吗?

value<array[i].value 

VS

e.value<value