赞
踩
dropWhile
0->n-1 drop 新建一个数组,直到identity
返回false
dropRightWhile
n-1->0 droptakeWhile
takeRightWhile
参数是一样的 fn(array, [predicate=_.identity])
identity
是一个函数,接受三个参数,会经过baseIteratee
处理。
源码分析:
//首先用baseIteratee处理identity
function dropWhile(array, predicate) {
return (array && array.length)
? baseWhile(array, baseIteratee(predicate, 3), true)
: [];
}
// baseIteratee返回的是一个identity函数,默认返回如下函数。还有很多个情况,见下文
function identity (value){
return value // 返回会被Boolean强转
}
arr=[true,1,{},[],'']
_.dropWhile(arr) //-> ['']
如果没有第二个参数,会直接使用默认的identity
函数。不然
baseIteratee
函数处理可以接受四种类型的参数函数、对象、数组、其他
function
函数,会直接返回var users = [
{ 'user': 'barney', 'active': true },
{ 'user': 'fred', 'active': true },
{ 'user': 'pebbles', 'active': false }
];
_.dropWhile(users, function(o) { return o.active; });
// => objects for ['pebbles']
null
空,返回identity
function identity(value){
return value
}
//for example
arr=[true,1,{},[],'',{}]
_.dropWhile(arr) //-> ['',{}]
object
对象且非数组,会经过baseMatches
处理返回baseIsMatch
判断两个对象属性是否相等
var users = [
{ 'user': 'barney', 'active': true },
{ 'user': 'fred', 'active': true },
{ 'user': 'pebbles', 'active': false }
];
_.dropWhile(users, { 'user': 'barney', 'active': false });
// => objects for ['fred', 'pebbles']
array
数组,会经过baseMatchesProperty
处理。//要求: array = [path, value]。为对象的属性路径和值。 //返回结果简要为 function array(key, srcValue) { return function(object) { return object[key] === srcValue }; //还有其他情况 } //for example var users = [ { 'user': 'fred', 'active': 123 }, { 'user': 'fred', 'active': 234 }, { 'user': 'pebbles', 'active': 345 }, { 'user': 'fred', 'active': 234 }, ]; _.dropWhile(users,['user','barney']) // => [{ 'user': 'pebbles', 'active': 345 },{ 'user': 'fred', 'active': 234 }]
other
其他,会经过property
处理。//property返回一个函数,函数根据对象参数会返回属性值 let fn1 = _.property('a') fn1({a:121}) // -> 121 let fn1 = _.property(['a','b']) fn2({a:{b:"24242"}}) // ->24242 //for example var users = [ { 'user': 'barney', 'active': [] }, { 'user': 'fred', 'active': null }, { 'user': 'pebbles', 'active': true }, { 'user': 'pebbles', 'active': false }, ]; _.dropWhile(users, 'active'); // => [ // { 'user': 'fred', 'active': null }, // { 'user': 'pebbles', 'active': true }, // { 'user': 'pebbles', 'active': false }, //]
那么问题来了:
let arr = [{a:1,b:undefined},{a:2}]
let res1 = _.dropWhile(arr,'b')
let res2 = _.dropWhile(arr,['b'])
请问res1.length
、res2.length
相等吗?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。