js二分查找、数组判断相等

本文探讨了JavaScript中的两种技术:如何通过排序和toString方法判断两个数组是否相等,以及如何实现二分查找。提供的代码经过验证,确保有效。同时提到了归并排序在数组操作中的应用。


下面代码都是亲测有效的!

数组判断相等

这里的判断,是判断,数组的元素是否相等(各元素的位置可以不同,但是必须含有一样的元素)

var array1 = [110,210,310,410,510];
var array2 = [210,110,410,310,510];
console.log(array1.sort().toString == array2.sort().toString);

使用array1.sort().toString == array2.sort().toString)

参考文献js中判断两个数组是否相等

js二分查找

/**
 * 二分查找的递归实现
 * @param {*} arr 以及排好序的数组
 * @param {*} low 从0开始
 * @param {*} high 数组长度-1
 * @param {*} key 需要查找的值
 */
function binary_search(arr,low, high, key) {
    if (low > high){
        return -1;
    }
    var mid = parseInt((high + low) / 2);
    if(arr[mid] == key){
        return mid;
    }else if (arr[mid] > key){
        high = mid - 1;
        return binary_search(arr, low, high, key);
    }else if (arr[mid] < key){
        low = mid + 1;
        return binary_search(arr, low, high, key);
    }
}

参考文献JS二分查找

如果需要对数组进行排序,可以参考归并排序之js实现

<think>好的,我现在需要回答用户关于JavaScript中查找数组元素下标的方法的问题。首先,我得回顾用户提供的引用内容,看看哪些信息可以利用。用户提供了五个引用,其中引用[1]、[2]、[3]、[4]都是关于JavaScript或其他语言中数组下标查找的方法,而引用[5]是关于数组的底层结构,可能不太相关,但可以作为背景知识。 用户的问题是询问JavaScript中获取数组元素下标的方法,所以重点在引用[1]、[2]、[3]、[4]。引用[1]提到使用indexOf()方法,引用[2]展示了indexOf的使用示例,引用[3]讨论了自定义的查找函数,引用[4]则介绍了二分查找的方法。 首先,我应该列举JavaScript中常用的方法,比如indexOf和findIndex。然后可能需要提到lastIndexOf,这是用户可能没有提到但相关的方法。另外,ES6引入的findIndex方法,基于回调函数,适用于更复杂的查找条件。接着,自定义循环方法也是可行的,尤其是当用户需要兼容旧浏览器或处理特殊需求时。最后,如果数组是有序的,二分查找是更高效的选择,如引用[4]中的例子。 需要注意用户可能的需求,比如是否只需要第一个匹配项,或者所有匹配项的下标。比如,indexOf只能找到第一个,而如果要找到所有,可能需要循环或使用其他方法。但用户的问题中没有提到所有下标,所以可能不需要深入讨论,但可以简要提及。 另外,要比较这些方法的优缺点。例如,indexOf简单但只能处理基本类型,而findIndex可以处理对象数组或复杂条件。二分查找需要数组有序,但效率更高。自定义循环灵活但代码较多。 还要注意语法正确性,比如箭头函数的使用,严格相等(===)的重要性,避免类型转换的问题。同时,是否需要处理稀疏数组的情况?比如,如果数组有空位,indexOf会如何处理?但可能用户的问题不涉及这些细节,保持回答简洁即可。 现在组织结构:先介绍直接的方法(indexOf、lastIndexOf),然后是ES6的findIndex,接着是自定义循环,最后是二分查找。每个方法给出示例代码,并说明适用场景和注意事项。最后总结比较,帮助用户选择合适的方法。 需要确保回答结构清晰,分点说明,代码示例正确,使用中文,并且引用相关引用内容。例如,在提到indexOf时引用[1]和[2],自定义函数时引用[3],二分查找引用[4]。 可能的问题:用户提供的引用中有Java的例子,但用户的问题是关于JavaScript的,所以需要区分开。比如引用[3]中的Java代码,但对应的JavaScript函数部分可以引用。 最后,生成相关问题,可能涉及性能比较、不同方法的适用场景、处理重复元素的方法等。</think>### JavaScript中获取数组下标的常用方法 #### 1. **indexOf() 方法** - **功能**:返回元素在数组中首次出现的索引,若不存在则返回 `-1` - **特点**:严格类型匹配(`===`),仅适用于基本数据类型 - **示例**: ```javascript const arr = [6, 36, 68, 86, 50]; console.log(arr.indexOf(68)); // 输出: 2 console.log(arr.indexOf(100)); // 输出: -1 ``` > 参考示例:[^2][^3] #### 2. **lastIndexOf() 方法** - **功能**:返回元素在数组中最后一次出现的索引,不存在则返回 `-1` - **适用场景**:查找重复元素的最后位置 - **示例**: ```javascript const arr = [6, 36, 68, 68, 50]; console.log(arr.lastIndexOf(68)); // 输出: 3 ``` #### 3. **findIndex() 方法(ES6+)** - **功能**:通过回调函数查找符合条件元素的索引 - **特点**:支持复杂条件(如对象数组、不等式判断) - **示例**: ```javascript const users = [{id:1}, {id:2}, {id:3}]; const index = users.findIndex(item => item.id === 2); console.log(index); // 输出: 1 ``` #### 4. **自定义遍历方法** - **适用场景**:需要兼容旧浏览器或特殊需求(如中断遍历) - **示例**: ```javascript function customIndexOf(arr, target) { for (let i = 0; i < arr.length; i++) { if (arr[i] === target) return i; } return -1; } ``` > 类似实现参考:[^3] #### 5. **二分查找(有序数组)** - **条件**:数组必须已排序 - **时间复杂度**:$O(\log n)$ - **示例**: ```javascript function binarySearch(arr, target) { let left = 0, right = arr.length - 1; while (left <= right) { const mid = Math.floor((left + right) / 2); if (arr[mid] === target) return mid; arr[mid] < target ? left = mid + 1 : right = mid - 1; } return -1; } ``` > 参考实现:[^4] --- ### **方法对比与选择建议** | 方法 | 适用场景 | 时间复杂度 | 特点 | |-----------------|--------------------------|------------|--------------------------| | `indexOf()` | 简单类型快速查找 | $O(n)$ | 内置方法,代码简洁 | | `findIndex()` | 复杂条件查询 | $O(n)$ | 支持回调函数 | | 自定义遍历 | 兼容性要求或特殊逻辑 | $O(n)$ | 完全控制遍历过程 | | 二分查找 | 大规模有序数组 | $O(\log n)$| 效率高,需预先排序 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值