美文网首页
2022-04-19 lodash源码学习 - fromPair

2022-04-19 lodash源码学习 - fromPair

作者: 网恋被骗二块二 | 来源:发表于2022-04-20 09:00 被阅读0次

    前情提要:indexOf进入方法体的判断有点理解不能(value === value自身和自身判断基本都是true,如果有知道是FALSE的大佬希望能在评论区指点一下!),基本上都是进入strictIndexOf方法。


    function fromPairs(pairs)
    反向版 _.toPairs,这个方法返回一个由键值对构成的对象。

    @param {Array} pairs The key-value pairs.
    键值对 数组

    function fromPairs(pairs) {
            //   数组循环起始下标
            var index = -1,
            // 获取数组长度
                length = pairs == null ? 0 : pairs.length,
                // 保存结果的对象
                result = {};
            // 遍历数组
            while (++index < length) {
                // 取出当前项
              var pair = pairs[index];
            //   给对象新增属性和配置属性值
              result[pair[0]] = pair[1];
            }
            // 总结:原理十分简单,键值对都是属性+属性值的形式,所以直接遍历数组,然后将该项的0项作为属性,1项作为属性值
            return result;
          }
    

    function head(array)
    获得数组的首个元素

    @param {Array} array The array to query.
    要检索的数组

    function head(array) {
            // 判断数组是否存在(转Boolean为true)并且数组长度存在(因为空数组转boolean也是true)
            // 如果条件满足,则返回数组的第一项,否则返回undefined
            return (array && array.length) ? array[0] : undefined;
          }
    

    function indexOf(array, value, fromIndex)
    根据 value 使用 SameValueZero 等值比较返回数组中首次匹配的 index, 如果 fromIndex 为负值,将从数组尾端索引进行匹配,如果将 fromIndex 设置为 true,将使用更快的二进制检索机制。

    @param {Array} array The array to inspect.
    要检索的数组

    @param {*} value The value to search for.
    要检索的值

    @param {number} [fromIndex=0] The index to search from.
    需要检索的起始位置。

    function indexOf(array, value, fromIndex) {
            //  获取数组长度
            var length = array == null ? 0 : array.length;
            // 判断长度是否为0
            if (!length) {
                // 若为0说明非数组或空数组,返回-1
              return -1;
            }
            // 数组检索下标,如果没有传递该参数,则默认从第一位开始,若传递参数,则使用toInteger转化为数字
            var index = fromIndex == null ? 0 : toInteger(fromIndex);
            if (index < 0) {
                // 判断转化后起始下标是否小于零?(输入负数表示从数组倒数第几位开始查询,并且需要转换成合法的数组下标)
                // 如果该下标加上数组长度后和0比较,取最大值
              index = nativeMax(length + index, 0);
            }
            // 将该参数传至基础版indexOf
            return baseIndexOf(array, value, index);
          }
    

    接上面

    function baseIndexOf(array, value, fromIndex) {
            console.log('-------------')
            console.log('value判断结果:')
            console.log(value === value)
            console.log('-------------')
            // 这一步有点不是很清楚,经过测试,value和value的全等于比较,基本都是true
            // 所以很多时候操作直接进入到了strictIndexOf中
            // 什么时候进入baseFindIndex就不是很清楚了
            // 他是 value 和 value 自身进行判断,所以这个条件恒等于true?我不确定
          return value === value
            ? strictIndexOf(array, value, fromIndex)
            // baseIsNaN
            // 如果“value”为“NaN”则返回“true”,否则返回“false”。
            : baseFindIndex(array, baseIsNaN, fromIndex);
        }
    

    function strictIndexOf(array, value, fromIndex)
    参数配置同indexOf
    'indexOf'的一个特殊版本,它对值执行严格的相等比较,即 ===

    function strictIndexOf(array, value, fromIndex) {
            // 循环起始下标
          var index = fromIndex - 1,
        //  数组长度
              length = array.length;
        //  遍历
          while (++index < length) {
            //   如果数组当前项全等于搜索项时,另外,在上一步操作中,如果传递的是一个对象,很有可能为fasle,引用数据类型的全等于判断和等于不同,这一点需要注意
            if (array[index] === value) {
                // 结束循环,返回当前遍历到的数组下标
              return index;
            }
          }
        //  如果遍历结束后仍未找到该值,则返回 -1 
          return -1;
        }
    

    function baseFindIndex(array, predicate, fromIndex, fromRight)
    _.findIndex_.findLastIndex的不支持迭代的简写版。

    function baseFindIndex(array, predicate, fromIndex, fromRight) {
            // 在baseIndexOf的调用中,已知传入了数组<array>、baseIsNaN<function>、起始下标<index: number>
            // 这个方法是用作寻找引用数据类型的下标
            // 获取数组长度
          var length = array.length,
            // new一个循环所用的初始值
            // 运算解读:formIndex是起始位置,也就是在indexOf调用时的第三个参数
            // 此时用起始位置index 去 加上 formRight(指定从右到左的迭代),如果formRight有参数,那么+1,否则-1
            // 为什么要+1 或 -1 呢?这应该是lodash开发者自己编程习惯,比如说从0开始循环,他们要给index赋值-1,然后++index<length这样循环
              index = fromIndex + (fromRight ? 1 : -1);
            // 判断fromRigh是否存在,若存在,从数组尾部往前循环,若不存在,从数组头部开始循环
          while ((fromRight ? index-- : ++index < length)) {
            //  baseIsNaN只接收一个参数,而传递的三个参数中,只有 array[index] 能够被识别并使用
            //  baseIsNaN判断该值如果是 NaN,则返回 true,否则返回FALSE,但他是 value !== value 所以不太清楚这到底判断出什么了
            if (predicate(array[index], index, array)) {
              return index;
            }
          }
          return -1;
        }
    

    相关文章

      网友评论

          本文标题:2022-04-19 lodash源码学习 - fromPair

          本文链接:https://www.haomeiwen.com/subject/qshsertx.html