能用英语解释Lodash Iteratee功能吗?

时间:2017-04-13 06:01:29

标签: lodash

我正在试图弄清楚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 }]

1 个答案:

答案 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];

1。属性iteratee

当使用字符串调用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');

2。匹配iteratee

当使用对象调用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});

3。匹配属性iteratee

这类似于匹配iteratee,但是在使用键和值数组调用iteratee时创建。

上面创建的is25函数也可以这样创建:

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

属性也可以是键的路径,这是使用匹配iteratee无法完成的事情:

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

使用iteratees

大多数情况下,您不会直接调用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}并将其用作过滤人员集合的函数。