js indexOf 的使用方法

1. 概念

JavaScript indexOf() 方法用于查找数组中元素的索引位置。它接受一个参数,该参数是要查找的元素,然后返回该元素在数组中第一次出现的索引。如果元素不存在于数组中,则返回 -1。

语法

javascript 复制代码
array.indexOf(searchElement, fromIndex)
  • searchElement: 要查找的元素。
  • fromIndex (可选): 开始查找的起始位置,默认为 0。如果指定了 fromIndex,则从该索引处开始向后查找。如果 fromIndex为负数,则它表示在数组末尾的偏移量,例如 -1 表示在最后一个元素之前开始查找。

返回值

indexOf() 方法返回搜索元素的索引,如果找到,则返回该元素的索引值;如果没有找到,则返回 -1。

2. indexOf() 查找简单数组

javascript 复制代码
const array = [2, 9, 9, 4, 6, 7, 8];

console.log(array.indexOf(9)); // 输出: 1
console.log(array.indexOf(9, 2)); // 输出: 2
console.log(array.indexOf(5)); // 输出: -1

在上面的例子中,indexOf() 方法首先查找数字 9 在数组中的索引位置。然后,第二次使用 indexOf() 方法指定了起始搜索位置 2,并且找到了第二个数字 9 的索引。最后一个例子中,搜索的数字 5 不存在于数组中,因此返回 -1。

3.indexOf() 查找复杂数组

indexOf() 方法在 JavaScript 中也可用于查找复杂类型(比如对象或数组)在数组中的位置。但是,对于复杂类型的查找,有一些需要注意的情况:

3.1 对象数组的 indexOf() 用法

如果要在包含对象的数组中查找对象,indexOf() 方法会在查找时比较引用而不是值。这意味着它会检查对象是否完全相同,而不是检查对象的属性值是否相同。

javascript 复制代码
const array = [
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' },
    { id: 3, name: 'Charlie' }
  ];
  
  const obj = { id: 2, name: 'Bob' };
  
  console.log(array.indexOf(obj)); // 输出: -1,因为这是一个新的对象,与数组中的对象不是同一个引用
  
  console.log(array.indexOf(array[1])) // 输出: 1

上述例子中,尽管 obj 具有相同的属性值,但它是一个新对象,因此 indexOf() 返回 -1。要在数组中找到具有相同属性值的对象,可以使用 findIndex() 方法:

javascript 复制代码
const index = array.findIndex(element => element.id === obj.id && element.name === obj.name);
console.log(index); // 输出: 1,找到了具有相同属性值的对象在数组中的索引

3.2 数组中的数组的 indexOf() 用法

如果数组中包含其他数组,indexOf() 仍然会比较引用而不是值。如果你想要检查数组中是否包含一个具有相同值的子数组,可以使用 findIndex() 方法。

javascript 复制代码
const array = [
  [1, 2],
  [3, 4],
  [5, 6]
];

const subArray = [3, 4];

const index = array.findIndex(element => element.every((val, i) => val === subArray[i]));
console.log(index); // 输出: 1,找到了具有相同值的子数组在数组中的索引

上面的例子中,findIndex() 和 every() 方法被用于比较数组中的子数组是否具有相同的值。

4. 总结

总之,对于复杂类型的数组,indexOf() 方法会检查引用而不是值。因此,在这样的情况下,可能需要使用 findIndex() 或自定义条件的方法来查找所需的元素。

相关推荐
哎哟喂呢哈4 小时前
VedioJS 10
javascript·html5
夏幻灵12 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
三天不学习12 小时前
Egg.js 4 突然爆火,原因是否归结于AI 原生落地需求爆发?
前端·javascript·全栈·egg.js
xcs1940513 小时前
前端 vue 的前端页面debugger 进不去
前端·javascript·vue.js
小宋102118 小时前
A2UI从零实战:Agent安全生成交互界面与事件回传
javascript·人工智能·安全·交互
大包子19 小时前
structuredClone vs lodash.cloneDeep:核心差异与选型指南
javascript·vue.js
lerhxx19 小时前
AI 应用中的上下文管理 —— 从"上下文窗口"到"分层压缩"的工程实践
前端·javascript
Mahut20 小时前
我在 Mac 上做了个本地剪辑器
javascript·架构·产品
汉堡大王952720 小时前
GPT-6 上线 48 小时,我扒开了 Intelligent UI 的运行机制:DIL、沙箱 Worker 和一个 React 式协调器
前端·javascript·后端
hai_android20 小时前
Chat 聊天模块功能总结
前端·javascript·vue.js