昨天看了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)
我們再繼承說baseWhile
。baseWhile(array, predicate, isDrop, fromRight)
,從定名上來看,isDrop
示意是不是是drop要領,翻看別的部份,再takeWhile
中也用到了baseWhile
。fromRight
示意遞次是從右到左照樣從左到右
假定我們當前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
上一篇我已簡樸引見過了。鏈接
這是我本身的亂言亂語,也願望對看到的人有協助。