JavaScript 专题之九:数组中查找指定元素


本文摘自PHP中文网,作者coldplay.xixi,侵删。

文章目录

    • 一、findIndex 和 findLastIndex
        • 1.1 findIndex
        • 1.2 findLastIndex
        • 1.3 合并 findIndex 和 findLastIndex
    • 二、sortIndex
        • 2.1 遍历
        • 2.2 二分法
    • 三、indexOf 和 lastIndexOf
        • 3.1 indexOf 的第一版实现
        • 3.2 indexOf 和 lastIndexOf 通用第一版
        • 3.3 indexOf 和 lastIndexOf 通用第二版
    • 参考
    • 写在最后

(免费学习推荐:javascript视频教程

一、findIndex 和 findLastIndex

1.1 findIndex

findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。

1

const array1 = [5, 12, 8, 130, 44];const isLargeNumber = (element) => element > 13;console.log(array1.findIndex(isLargeNumber));// expected output: 3

实现

1

2

3

4

5

6

7

8

9

Array.prototype.newFindIndex = function(callback) {

  const _arr = this;

  const len = _arr.length;

  for (let i = 0; i < len; i++) {

    if (callback(_arr[i], i, _arr)) {

      return i;

    }

  }

  return -1;};const array1 = [5, 12, 8, 130, 44];const isLargeNumber = (element) => element > 13;console.log(array1.newFindIndex(isLargeNumber));// 3

1.2 findLastIndex

同样当我们倒叙查找首个满足条件的方法时,可以这样写:

1

2

3

4

5

6

7

8

9

Array.prototype.newFindlastIndex = function(callback) {

  const _arr = this;

  const len = _arr.length;

  for (let i = len - 1; i >= 0; i--) {

    if (callback(_arr[i], i, _arr)) {

      return i;

    }

  }

  return -1;};const array1 = [5, 12, 8, 130, 44];const isLargeNumber = (element) => element > 13;console.log(array1.newFindlastIndex(isLargeNumber));// 4

上面的代码,和正序查找很相似,仅仅改变遍历的条件。

1.3 合并 findIndex 和 findLastIndex

大家可以看到,除了循环的条件不同,两个方法几乎一模一样,参考 lodash,我们将两个方法精简一下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

/**

 * @private

 * @param {Array} array The array to inspect.

 * @param {Function} predicate The function invoked per iteration.

 * @param {boolean} [fromRight] 从右向左查找

 * @returns {number} 返回第一个符合条件元素的下标或-1

 */function baseFindIndex(array, predicate, fromRight) {

  const { length } = array;

  let index = fromRight ? length : -1; // 确定下标的边界

 

  while (fromRight ? index-- : ++index < length) {

    // index-- 用于倒序边界

    // ++index 用于正序的边界

    if (predicate(array[index], index, array)) {

      return index;

    }

  }

  return -1;}

再来看看它的兄弟――underscore 的思路就是利用传参的不同,返回不同的函数。

1

2

3

4

5

6

7

8

9

10

function createIndexFinder(dir) {

  return function(array, predicate, context) {

    const { length } = array;

    var index = dir > 0 ? 0 : length - 1;

 

    for (; index >= 0 && index < length; index += dir) {

      if (predicate.call(context, array[index], index, array)) return index;

    }

    return -1;

  };}var findIndex = createIndexFinder(1);var findLastIndex = createIndexFinder(-1);

关于 findIndex 我们就告一段落了~,再来看看新的场景和实现吧!

在这里插入图片描述

二、sortIndex

在一个排好序的数组中找到 value 对应的位置,即保证插入数组后,依然保持有序的状态。

1

const arr = [1, 3, 5];sortedIndex(arr, 0); // 0// 不需要插入arr

那么这个又该如何实现呢?

2.1 遍历

遍历大家都能想到,虽然它不一定最优解:

阅读剩余部分

相关阅读 >>

快来看看 ajax实时刷新处理

es6 map原理分析

javascript中sort()方法怎么用

javascript中generator函数的详理解

js中null是什么意思?

javascript用什么分割成数组

javascript介绍ajax加载单张图片展示进度的方法

java和javascript关系大吗

你知道原生html组件是什么吗?原生html组件的介绍

javascript中return的含义是什么

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...