如何使用FindIndex从数组末尾开始循环遍历数组?

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

我需要获取

errorIdx = 3
,但我得到 0。如何从数组末尾开始循环?

  const scrollPosition = 5007
  const errorsHeight = [947, 2498, 3495, 4805, 5755]

  errorIdx = errorsHeight.findIndex((itemHeight: number) => itemHeight < scrollPosition)
  console.log(errorIdx) // 0
javascript arrays loops search callback
5个回答
1
投票

findLastIndex
的替代实现,其中回调函数知道
thisArg
上下文/目标,并且也将使用其三个参数
[element, index, array]
进行调用;因此遵循
findIndex
...

的标准

function findLastIndex(arr, test, target) {
  if (!arr && ((arr ?? true) === true)) {
    throw new TypeError('findLastIndex called on null or undefined');
  };
  if (typeof test !== 'function') {
    throw new TypeError(`${ test } is not a function`);
  };
  if (!Array.isArray(arr)) {
    arr = Array.from(arr);
  }
  target = target ?? null;

  let isContinue = true;
  let idx = arr.length;

  // assures -1 as return value for nothing found.
  while ((idx >= 0) && isContinue) {

    // be aware of sparse array slots ... and ...
    // be a guard for the negative index default.
    if (arr.hasOwnProperty(--idx)) {

      isContinue = !test.call(target, arr[idx], idx, arr);
    }
  }
  return idx;
}

const errorsHeight = [947, 2498, 3495, 4805, 5755];
const scrollPosition = 5007;

console.log(
  findLastIndex(errorsHeight, (height/*, idx, arr*/) =>
    height < scrollPosition
  )
);
console.log(
  findLastIndex(errorsHeight, height => height < 5)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }


0
投票

对数组进行重新排序或反转它会为您的解决方案增加额外的 O(n) 时间复杂度。

简单的方法是创建一个辅助函数,从数组末尾开始查找索引:

function findLastIndex(arr, comparator){
    for(let i = arr.length - 1; i > 0; i--){
        const valid = comparator(arr[i], i);
        if(valid){
            return i;
        }
    }

    return -1;
}


console.log(findLastIndex(errorsHeight, (itemHeight: number) => itemHeight < scrollPosition))

0
投票

最好使用简单的 for,如下所示:

const scrollPosition = 5007;
const errorsHeight = [947, 2498, 3495, 4805, 5755];
let errorIdx = -1;

for (let i = 0; i < errorsHeight.length; i++)
    if((errorIdx === -1 && errorsHeight[i] < scrollPosition) || (errorIdx >= 0 && errorsHeight[i] < scrollPosition && errorsHeight[i] > errorsHeight[errorIdx]))
        errorIdx = i;

console.log(errorIdx) //3
;D


0
投票

常量滚动位置 = 5007 常量错误高度 = [947, 2498, 3495, 4805, 5755]

errorIdx = errorHeight.reduce((r: 数字, itemHeight: 数字) => itemHeight < scrollPosition) console.log(errorIdx) // 0

constleadingHost = [ ...instances].reduceRight((r, { state, $address }, _, a) => { if (state === 'leading') return a.length = 0, $address }, '')


-1
投票

您可以通过过滤器保留匹配项的数组,然后报告该数组的长度。我在此处添加了

sort
以确保数组按数字顺序排列。

const scrollPosition = 5007
const errorsHeight = [947, 2498, 3495, 4805, 5755]

errorIdx = errorsHeight
            .sort((a, b) => a - b)
            .filter(itemHeight => itemHeight < scrollPosition)
            .length - 1
console.log(errorIdx) 

© www.soinside.com 2019 - 2024. All rights reserved.