2017-04-13 14 views
8

我想弄清楚Lodash迭代器是如何工作的以及我会在哪里使用它。能否用英文解释Lodash Iteratee函数?

文档说:

创建调用FUNC与创建的函数的自变量的函数。如果func是属性名称,则创建的函数将返回给定元素的属性值。如果func是数组或对象,则创建的函数对包含等效源属性的元素返回true,否则返回false。

这是文档中的一个例子,但是我在解决这个问题时遇到了一些麻烦。

var users = [ 
    { 'user': 'barney', 'age': 36, 'active': true }, 
    { 'user': 'fred', 'age': 40, 'active': false } 
]; 

// The `_.matches` iteratee shorthand. 
_.filter(users, _.iteratee({ 'user': 'barney', 'active': true })); 
// => [{ 'user': 'barney', 'age': 36, 'active': true }] 

回答

17

基本上是一个迭代函数。当您调用lodash的iteratee函数时,它会返回一个函数,稍后可以在代码中使用该函数。

有3种不同类型的iteratee,我将依次使用示例代码中的以下对象进行描述。

let mary = { 
    name: 'mary', 
    gender: 'female', 
    age: 25, 
    job: { 
     title: 'teacher', 
     salary: 10000 
    } 
} 

let dave = { 
    name: 'dave', 
    gender: 'male', 
    age: 27 
} 

let oswald = { 
    name: 'oswald', 
    gender: 'male', 
    age: 25 
} 

let people = [mary, dave, oswald]; 

1.物业iteratee

iteratee是带一个字符串,它返回将用提供的字符串的键返回一个对象的属性的功能。

例如

let getAge = _.iteratee('age'); 

我们结束了在这里的是,返回 对象的年龄属性的功能。类似于:

function getAge(object){ 
    return object['age']; 
} 

所以我们可以使用getAge返回的人的年龄:

let marysage = getAge(mary); 
let davesage = getAge(dave); 

的字符串也可以是一个属性的路径:

let jobtitle = _.iteratee('job.title'); 

2。匹配iteratee

iteratee被一个对象调用时,它返回如果对象具有与给定值匹配的关键字,则谓词(返回true或false)。

例如

let is25 = _.iteratee({age: 25}); 

let isMary25 = is25(mary); 
let isDave25 = is25(dave); 

匹配iteratee不限于单个属性。它可以采取多个键和值:

let isFemaleAged25 = _.iteratee({gender: 'female', age: 25}); 

3.匹配属性iteratee

这类似于火柴iteratee但当iteratee被调用键和值的阵列创建的。

上面创建的is25功能也像这样被创建:

let is25 = _.iteratee(['age', 25]); 

的属性也可以是一个关键的路径,东西不能用比赛来完成iteratee:

let isTeacherAged25 = _.iteratee(['age', 25, 'job.title', 'teacher']) 

使用迭代

大多数情况下,您不会直接调用iteratee函数。当你调用一个可以迭代的函数时,Lodash会在内部使用这个函数。

例如

let names = _.map(people, 'name'); // => ['mary', 'dave', 'oswald'] 

这里lodash将调用iteratee以字符串name,并用它作为函数来调用地图。

let peopleAged25 = _.filter(people, {age: 25 }); // mary and oswald 

这里lodash将调用iteratee与对象{age: 25},并以此为筛选人收藏的功能。

+0

感谢您的简明回答和解释。 – johnwick0831

+1

真棒answer.Very详细 –