我正在试图弄清楚Lodash iteratee是如何工作的以及我将在何处使用它。
文档说:
创建一个函数,该函数使用创建函数的参数调用func。如果func是属性名称,则created函数返回给定元素的属性值。如果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 }]
答案 0 :(得分:35)
iteratee基本上是一个函数。当你调用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];
当使用字符串调用iteratee时,它返回一个函数,该函数将使用提供的字符串的键返回对象的属性。
e.g。
let getAge = _.iteratee('age');
我们最终得到的是一个返回an的age属性的函数 宾语。类似于:
function getAge(object){
return object['age'];
}
因此我们可以使用getAge
来返回人的年龄:
let marysage = getAge(mary);
let davesage = getAge(dave);
字符串也可以是属性的路径:
let jobtitle = _.iteratee('job.title');
当使用对象调用iteratee时,如果对象具有与给定值匹配的键,则返回谓词(返回true或false)。
e.g。
let is25 = _.iteratee({age: 25});
let isMary25 = is25(mary);
let isDave25 = is25(dave);
匹配iteratee不限于单个属性。它可能需要多个键和值:
let isFemaleAged25 = _.iteratee({gender: 'female', age: 25});
这类似于匹配iteratee,但是在使用键和值数组调用iteratee时创建。
上面创建的is25
函数也可以这样创建:
let is25 = _.iteratee(['age', 25]);
属性也可以是键的路径,这是使用匹配iteratee无法完成的事情:
let isTeacherAged25 = _.iteratee(['age', 25, 'job.title', 'teacher'])
大多数情况下,您不会直接调用iteratee函数。当您调用可以执行迭代的函数时,Lodash将在内部使用该函数。
e.g。
let names = _.map(people, 'name'); // => ['mary', 'dave', 'oswald']
此处lodash将使用字符串iteratee
调用name
并将其用作调用地图的函数。
let peopleAged25 = _.filter(people, {age: 25 }); // mary and oswald
此处lodash将使用对象iteratee
调用{age: 25}
并将其用作过滤人员集合的函数。