当前位置:首页 > JavaScript

js indexof 实现

2026-03-13 23:50:30JavaScript

实现 JavaScript 的 indexOf 方法

JavaScript 的 indexOf 方法用于返回指定值在字符串或数组中首次出现的位置。以下是自定义实现方案:

字符串版本的 indexOf 实现

function customIndexOf(str, searchValue, fromIndex = 0) {
  if (fromIndex < 0) fromIndex = 0;
  if (fromIndex >= str.length) return -1;

  for (let i = fromIndex; i < str.length; i++) {
    if (str[i] === searchValue[0]) {
      let match = true;
      for (let j = 0; j < searchValue.length; j++) {
        if (str[i + j] !== searchValue[j]) {
          match = false;
          break;
        }
      }
      if (match) return i;
    }
  }
  return -1;
}

参数说明:

  • str: 被搜索的原始字符串
  • searchValue: 需要查找的子字符串
  • fromIndex: 可选参数,指定开始搜索的位置

特性:

  • 支持子字符串匹配
  • 处理负数的 fromIndex
  • 返回首次匹配的索引或 -1

数组版本的 indexOf 实现

function arrayIndexOf(arr, searchElement, fromIndex = 0) {
  if (fromIndex < 0) fromIndex = Math.max(0, arr.length + fromIndex);

  for (let i = fromIndex; i < arr.length; i++) {
    if (arr[i] === searchElement) return i;
  }
  return -1;
}

参数说明:

  • arr: 被搜索的数组
  • searchElement: 需要查找的元素
  • fromIndex: 可选参数,指定开始搜索的位置

特性:

  • 支持负数的 fromIndex(从数组末尾开始计算)
  • 使用严格相等比较(===)
  • 返回首次匹配的索引或 -1

性能优化建议

对于大型字符串或数组,可以考虑以下优化:

// Boyer-Moore 算法的简化版(适用于字符串搜索)
function optimizedIndexOf(str, pattern) {
  const badCharTable = {};
  for (let i = 0; i < pattern.length; i++) {
    badCharTable[pattern[i]] = i;
  }

  let shift = 0;
  while (shift <= str.length - pattern.length) {
    let j = pattern.length - 1;
    while (j >= 0 && pattern[j] === str[shift + j]) j--;
    if (j < 0) return shift;
    shift += Math.max(1, j - (badCharTable[str[shift + j]] || -1));
  }
  return -1;
}

优化点:

  • 使用坏字符启发式规则跳过不可能匹配的位置
  • 最坏情况下时间复杂度 O(n/m)
  • 适合长模式字符串的搜索

边界情况处理

完整实现应考虑以下边界情况:

js indexof 实现

  • 空字符串或空数组的搜索
  • NaN 元素的处理(原生 indexOf 无法找到 NaN
  • 稀疏数组的处理
  • Unicode 字符的匹配
// 处理NaN的特殊版本
function indexOfWithNaN(arr, element) {
  if (Number.isNaN(element)) {
    for (let i = 0; i < arr.length; i++) {
      if (Number.isNaN(arr[i])) return i;
    }
    return -1;
  }
  return arr.indexOf(element);
}

这些实现方案提供了自定义 indexOf 方法的核心功能,可以根据具体需求进行扩展和优化。

标签: jsindexof
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…