资讯专栏INFORMATION COLUMN

lodash.js源码-dropWhile

denson / 3667人阅读

摘要:昨天看了方法,今天是方法。为数组的一个,为当前数组的为原数组。还是先翻源码吧。返回了看楼下的代码段,返回了一个。与相比,提供了一个用于遍历迭代的函数,多使用到了一个。暂时只讨论为函数的情况。简化为数组长度,为不符合条件的角标。

昨天看了drop方法,今天是dropWhile方法。

使用

_.dropWhile(array, [predicate=_.identity])

创建一个切片数组,去除array中从起点开始到 predicate 返回假值结束部分。predicate 会传入3个参数: (value, index, array)。

value为数组的一个ele,index为当前数组的index,value为原数组。

 * var users = [
 *   { "user": "barney",  "active": false },
 *   { "user": "fred",    "active": false },
 *   { "user": "pebbles", "active": true }
 * ];
 *
 * _.dropWhile(users, function(o) { return !o.active; });
 * // => objects for ["pebbles"]
 *

其实看到这我有点懵逼,不知道是开了一天会的原因么。还是先翻源码吧。

function dropWhile(array, predicate) {
  return (array && array.length)
    ? baseWhile(array, baseIteratee(predicate, 3), true)
    : [];
}

dropWhile返回了baseWhile,看楼下的代码段,baseWhile返回了一个baseSlice。与drop相比,提供了一个predicate用于遍历迭代的函数,多使用到了一个baseWhile。类似于var dropWhile = (...) => baseWhile(...) => baseSlice(...)

function baseWhile(array, predicate, isDrop, fromRight) {
  var length = array.length,
      index = fromRight ? length : -1;

  while ((fromRight ? index-- : ++index < length) &&
    predicate(array[index], index, array)) {}

  return isDrop
    ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
    : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
}

predicate这个参数在传入baseWhile时,先被baseIteratee调用,我们先确认这个函数是用来做什么的。了解作者的目的。

import baseMatches from "./_baseMatches.js";
import baseMatchesProperty from "./_baseMatchesProperty.js";
import identity from "./identity.js";
import isArray from "./isArray.js";
import property from "./property.js";

/**
 * The base implementation of `_.iteratee`.

 */
function baseIteratee(value) {
  // Don"t store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
  if (typeof value == "function") {
    return value;
  }
  if (value == null) {
    return identity;
  }
  if (typeof value == "object") {
    return isArray(value)
      ? baseMatchesProperty(value[0], value[1])
      : baseMatches(value);
  }
  return property(value);
}

baseIteratee这个方法留给下一篇解决。暂时只讨论predicate为函数的情况。 baseIteratee会直接返回当前的传入的predicate.
baseWhile(array, baseIteratee(predicate, 3), true) => baseWhile(array, predicate, true)

我们再继续说baseWhilebaseWhile(array, predicate, isDrop, fromRight),从命名上来看,isDrop表示是否是drop方法,翻看其它部分,再takeWhile中也用到了baseWhilefromRight表示顺序是从右到左还是从左到右

假设我们当前fromRight为flase

我们思考如下代码,

 // now fromRight = false ,所有我们修改下代码
 var length = array.length,
      index =  -1;

  while ((++index < length) &&
    predicate(array[index], index, array)) {}

while循环如果符合条件会一直执行下去。当前while执行条件(++index < length) &&predicate(array[index], index, array),也就是遍历当前数组,然后当前数组对应的array[i]等参数传入predicate,一旦predicate返回fasle,就跳出当前循环,执行baseSlice

baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
//简化
baseSlice(array,  index,  length)// length为数组长度,index为不符合条件的角标。

predicate到底是什么

英文中是断言,断定的意思,我理解为一种判定(这里我有些模凌两可,感觉自己不对,有朋友纠正一下么。)

predicate函数用来判定符合你预先设定的条件,它总是返回true or false.如果不符合条件,说的直接点就是返回false,在baseWhile中就返回当前的index,然后去baseSlice(array,index,end)

关于baseSlice 上一篇我已经简单介绍过了。链接

这是我自己的乱言乱语,也希望对看到的人有帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94722.html

相关文章

  • lodash源码分析之去重--uniq方法

    摘要:包是开发中常用的工具包,里面有许多实用的方法,今天分析常用的一个去重方法用法源码包可以看到,函数这边只做了一个针对的封装,所以继续看源码 lodash.js包是node开发中常用的js工具包,里面有许多实用的方法,今天分析常用的一个去重方法---uniq 用法 _.uniq([2, 1, 2]) // => [2, 1] 源码包 // uniq.js i...

    Hujiawei 评论0 收藏0
  • 高效的 itertools 模块

    摘要:的使用形式和类似,它将中为的元素组成一个迭代器返回,如果是,则返回中所有计算为的项。用于将多个可迭代对象对应位置的元素作为一个元组,将所有元组组成一个迭代器,并返回。 itertools 我们知道,迭代器的特点是:惰性求值(Lazy evaluation),即只有当迭代至某个值时,它才会被计算,这个特点使得迭代器特别适合于遍历大文件或无限集合等,因为我们不用一次性将它们存储在内存中。 ...

    godruoyi 评论0 收藏0
  • 24 个实例入门并掌握「Webpack4」(二)

    摘要:代码如下所示按照正常使用习惯,操作来实现样式的添加和卸载,是一贯技术手段。将帮助我们进行操作。 继 24 个实例入门并掌握「Webpack4」(一) 后续: JS Tree Shaking CSS Tree Shaking 图片处理汇总 字体文件处理 处理第三方 js 库 开发模式与 webpack-dev-server 开发模式和生产模式・实战 打包自定义函数库 九、JS Tre...

    hlcc 评论0 收藏0
  • lodash.js 过滤出正整数

    摘要:在实际的开发场景中,我们经常需要对一组数组进行过滤,选出其中只含有正整数的值。比如接口的查询字符串中传入一组,该是正整数数值。有关方法的文档可以查询以下是源码,使用了的语法 在实际的开发场景中,我们经常需要对一组数组进行过滤,选出其中只含有正整数的值。比如接口的查询字符串中传入一组 id,该 id 是正整数数值。 有关方法的文档可以查询 Lodash Number.MAX_SAFE_...

    FrancisSoung 评论0 收藏0

发表评论

0条评论

denson

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<