lodash.js源碼-dropWhile

昨天看了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://segmentfault.com/a/1190000014724257
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞