javascriptarraysloopssearchcallback

How to loop through array with FindIndex from its end?


I need to get errorIdx = 3, but I get 0. How can I loop through array from its end?

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

  errorIdx = errorsHeight.findIndex((itemHeight: number) => itemHeight < scrollPosition)
  console.log(errorIdx) // 0

Solution

  • An alternative implementation of findLastIndex where the callback function is aware of a thisArg context/target and also will be invoked with its three parameters which are [element, index, array]; thus following the standard of 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; }