成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

lodash.js源碼-dropWhile

denson / 3679人閱讀

摘要:昨天看了方法,今天是方法。為數(shù)組的一個(gè),為當(dāng)前數(shù)組的為原數(shù)組。還是先翻源碼吧。返回了看樓下的代碼段,返回了一個(gè)。與相比,提供了一個(gè)用于遍歷迭代的函數(shù),多使用到了一個(gè)。暫時(shí)只討論為函數(shù)的情況。簡化為數(shù)組長度,為不符合條件的角標(biāo)。

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

使用

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

創(chuàng)建一個(gè)切片數(shù)組,去除array中從起點(diǎn)開始到 predicate 返回假值結(jié)束部分。predicate 會(huì)傳入3個(gè)參數(shù): (value, index, array)。

value為數(shù)組的一個(gè)ele,index為當(dāng)前數(shù)組的index,value為原數(shù)組。

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

其實(shí)看到這我有點(diǎn)懵逼,不知道是開了一天會(huì)的原因么。還是先翻源碼吧。

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

dropWhile返回了baseWhile,看樓下的代碼段,baseWhile返回了一個(gè)baseSlice。與drop相比,提供了一個(gè)predicate用于遍歷迭代的函數(shù),多使用到了一個(gè)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這個(gè)參數(shù)在傳入baseWhile時(shí),先被baseIteratee調(diào)用,我們先確認(rèn)這個(gè)函數(shù)是用來做什么的。了解作者的目的。

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這個(gè)方法留給下一篇解決。暫時(shí)只討論predicate為函數(shù)的情況。 baseIteratee會(huì)直接返回當(dāng)前的傳入的predicate.
baseWhile(array, baseIteratee(predicate, 3), true) => baseWhile(array, predicate, true)

我們再繼續(xù)說baseWhile。baseWhile(array, predicate, isDrop, fromRight),從命名上來看,isDrop表示是否是drop方法,翻看其它部分,再takeWhile中也用到了baseWhilefromRight表示順序是從右到左還是從左到右

假設(shè)我們當(dāng)前fromRight為flase

我們思考如下代碼,

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

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

while循環(huán)如果符合條件會(huì)一直執(zhí)行下去。當(dāng)前while執(zhí)行條件(++index < length) &&predicate(array[index], index, array),也就是遍歷當(dāng)前數(shù)組,然后當(dāng)前數(shù)組對應(yīng)的array[i]等參數(shù)傳入predicate,一旦predicate返回fasle,就跳出當(dāng)前循環(huán),執(zhí)行baseSlice。

baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
//簡化
baseSlice(array,  index,  length)// length為數(shù)組長度,index為不符合條件的角標(biāo)。

predicate到底是什么

英文中是斷言,斷定的意思,我理解為一種判定(這里我有些模凌兩可,感覺自己不對,有朋友糾正一下么。)

predicate函數(shù)用來判定符合你預(yù)先設(shè)定的條件,它總是返回true or false.如果不符合條件,說的直接點(diǎn)就是返回false,在baseWhile中就返回當(dāng)前的index,然后去baseSlice(array,index,end)

關(guān)于baseSlice 上一篇我已經(jīng)簡單介紹過了。鏈接

這是我自己的亂言亂語,也希望對看到的人有幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94722.html

相關(guān)文章

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

    摘要:包是開發(fā)中常用的工具包,里面有許多實(shí)用的方法,今天分析常用的一個(gè)去重方法用法源碼包可以看到,函數(shù)這邊只做了一個(gè)針對的封裝,所以繼續(xù)看源碼 lodash.js包是node開發(fā)中常用的js工具包,里面有許多實(shí)用的方法,今天分析常用的一個(gè)去重方法---uniq 用法 _.uniq([2, 1, 2]) // => [2, 1] 源碼包 // uniq.js i...

    Hujiawei 評論0 收藏0
  • 高效的 itertools 模塊

    摘要:的使用形式和類似,它將中為的元素組成一個(gè)迭代器返回,如果是,則返回中所有計(jì)算為的項(xiàng)。用于將多個(gè)可迭代對象對應(yīng)位置的元素作為一個(gè)元組,將所有元組組成一個(gè)迭代器,并返回。 itertools 我們知道,迭代器的特點(diǎn)是:惰性求值(Lazy evaluation),即只有當(dāng)?shù)聊硞€(gè)值時(shí),它才會(huì)被計(jì)算,這個(gè)特點(diǎn)使得迭代器特別適合于遍歷大文件或無限集合等,因?yàn)槲覀儾挥靡淮涡詫⑺鼈兇鎯?chǔ)在內(nèi)存中。 ...

    godruoyi 評論0 收藏0
  • 24 個(gè)實(shí)例入門并掌握「Webpack4」(二)

    摘要:代碼如下所示按照正常使用習(xí)慣,操作來實(shí)現(xiàn)樣式的添加和卸載,是一貫技術(shù)手段。將幫助我們進(jìn)行操作。 繼 24 個(gè)實(shí)例入門并掌握「Webpack4」(一) 后續(xù): JS Tree Shaking CSS Tree Shaking 圖片處理匯總 字體文件處理 處理第三方 js 庫 開發(fā)模式與 webpack-dev-server 開發(fā)模式和生產(chǎn)模式?實(shí)戰(zhàn) 打包自定義函數(shù)庫 九、JS Tre...

    hlcc 評論0 收藏0
  • lodash.js 過濾出正整數(shù)

    摘要:在實(shí)際的開發(fā)場景中,我們經(jīng)常需要對一組數(shù)組進(jìn)行過濾,選出其中只含有正整數(shù)的值。比如接口的查詢字符串中傳入一組,該是正整數(shù)數(shù)值。有關(guān)方法的文檔可以查詢以下是源碼,使用了的語法 在實(shí)際的開發(fā)場景中,我們經(jīng)常需要對一組數(shù)組進(jìn)行過濾,選出其中只含有正整數(shù)的值。比如接口的查詢字符串中傳入一組 id,該 id 是正整數(shù)數(shù)值。 有關(guān)方法的文檔可以查詢 Lodash Number.MAX_SAFE_...

    FrancisSoung 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<