当前位置:首页 > 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: 可选参数,指定开始搜索的位置

特性:

js indexof 实现

  • 支持子字符串匹配
  • 处理负数的 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: 可选参数,指定开始搜索的位置

特性:

js indexof 实现

  • 支持负数的 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)
  • 适合长模式字符串的搜索

边界情况处理

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

  • 空字符串或空数组的搜索
  • 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实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…