使用findIndex,但开始在特定位置查找

问题描述 投票:0回答:4

我有以下代码摘录:

private getNextFakeLinePosition(startPosition: number): number{
        return this.models.findIndex(m => m.fakeObject);
}

此函数返回具有真实值的属性

fakeObject
的第一个元素的索引。

我想要的是这样的东西,但我不想寻找数组的所有项目,而是想从特定位置开始(

startPosition
)。

注意:这是打字稿,但解决方案可以是 javascript vanilla。

javascript typescript
4个回答
13
投票

findIndex()
的回调接收当前索引,因此您可以这样添加条件:

private getNextFakeLinePosition(startPosition: number): number {
    return this.models.findIndex((m, i) => i >= startPosition && m.fakeObject);
}

不是最有效的解决方案,但只要你的数组不是太大就应该没问题。


8
投票

你可以尝试使用

slice
:

private getNextFakeLinePosition(startPosition: number): number {
  const index = this.models.slice(startPosition).findIndex(m => m.fakeObject);
  return index === -1 ? -1 : index + startPosition;
}

它将对您的输入数组进行切片并查找子数组上的索引。然后 - 最后,只需添加

startPosition
即可获得真正的索引。


5
投票

在这种情况下,我可能会使用 for 循环。它不会增加切片数组的开销,并避免不必要的索引检查。

const findStartFromPos = <T>(predicate: (e: T) => boolean, array: T[], startFrom: number): number => {
  for (let i = startFrom; i < array.length; i++) {
    if (predicate(array[i])) {
      return i;
    }
  }

  return -1;
};

4
投票

一个模糊但可行的解决方案是跳过索引,直到到达起始索引:

let startIndex = 4;
array.findIndex((item, index) => index >= startIndex && item.fakeObject);
© www.soinside.com 2019 - 2024. All rights reserved.