es-toolkit
Version:
A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.
32 lines (31 loc) • 1.16 kB
JavaScript
import { isArrayLike } from "../predicate/isArrayLike.mjs";
//#region src/compat/array/indexOf.ts
/**
* Finds the index of the first occurrence of a value in an array.
*
* This method is similar to `Array.prototype.indexOf`, but it also finds `NaN` values.
* It uses strict equality (`===`) to compare elements.
*
* @template T - The type of elements in the array.
* @param array - The array to search.
* @param searchElement - The value to search for.
* @param [fromIndex] - The index to start the search at.
* @returns The index (zero-based) of the first occurrence of the value in the array, or `-1` if the value is not found.
*
* @example
* const array = [1, 2, 3, NaN];
* indexOf(array, 3); // => 2
* indexOf(array, NaN); // => 3
*/
function indexOf(array, searchElement, fromIndex) {
if (!isArrayLike(array)) return -1;
if (Number.isNaN(searchElement)) {
fromIndex = fromIndex ?? 0;
if (fromIndex < 0) fromIndex = Math.max(0, array.length + fromIndex);
for (let i = fromIndex; i < array.length; i++) if (Number.isNaN(array[i])) return i;
return -1;
}
return Array.from(array).indexOf(searchElement, fromIndex);
}
//#endregion
export { indexOf };