Underscore 里面的 reduce 方法,可以把一个列表里面的所有的值,用你想要的方法换算成一个值。比如一个数字列表,你可以得到它们彼此相加的结果。
下面,我们使用这个方法去处理一下 numbers 这个数组 ... 让这个数组里的值彼此相加,返回这个相加之后的结果 ...
这个方法的第一个参数是要处理的列表,第二个参数是遍历器,或者叫迭代器,循环处理器 .. 第三个参数是存储结果的一个初始的状态 ... 最后有一个可选的 context 参数。
_.reduce ... 先指定一下要处理的列表 .. 这里就是 numbers 这个数组 .. 第二个参数是迭代器 ... 用一个匿名函数 ... 第三个参数是存储结果的初始状态 ... 这里我们设置成 0 ...
在这个迭代器函数里面支持几个参数 ... 第一个参数表示当前结果,一般用 memo 来表示,第二个参数表示本次循环的列表里面的值 .. 第三个参数是 index ,如果处理的列表是个对象的话,这个参数就应该是 key ,最后一个参数表示列表本身 ...
这里我们只需要两个参数 .. memo 还有 number ... number 列表 numbers 里面的一个数字。
然后在这个函数里面,返回处理的结果 ... return ... 用 memo 再加上 number ...
_.reduce(numbers, function(memo, number){ return memo + number; }, 0)
回车 ... 得到的结果是 10 ... 迭代器首先会处理 numbers 里面的第一个项目,也就是数字 3 ,存储的结果的初始状态是 0 ,要处理的动作就是,让 memo 加上 number ,第一次就应该是 0 加上 3 ... 结果是 3 ...
然后继续第二次循环 .. 这里的 memo 就是上一次处理的结果,也就是 0 + 3 算出来的结果 .. number 表示列表里面的第二个项目 ... 也就是数字 6 ... 然后用 3 加上 6 .. 再返回这个结果 ... 现在 memo 的值,就会是 9 了 ...
继续执行 ... 9 加上 numbers 里面的最后一个数字 1 ,结果就是这里显示的出来的数字 10 ...
对象
下面,我们再用这个方法去处理一个对象的属性 ... 先清理一下屏幕 .. command + K
要处理的对象是 album ... (#输入 album 回车)
要做的就是,把这个对象里的属性的名字和值连接到一块 ... 属性和名字之间用一个冒号 ... 不同的属性之间使用一个分号 ...
_.reduce ... 要处理的东西是 album ... 设置一下处理器 ... 用一个匿名函数 ... memo 的初始值设置成一个空白的字符串 ...
这个处理器要接受 memo 参数,还有 value 和 key 参数,value 表示对象属性的值,key 表示对象属性的名字 ...
在这个处理器里面,返回 memo ,也就是当前存储结果 ... 加上对象属性的名字 ... 再连接一个冒号 ... 然后是属性的值 ... 用 value 表示 ... 最后是一个分号 ..
_.reduce(album, function(memo, value, key){ return memo + key + ':' + value + ';';}, '' )
回车 ...
得到的结果就是用我们设置的形式连接的对象里面的属性 ... 属性名和值之间有一个冒号,不同属性之间有一个分号 ..