reduce() 方法是 ECMAScript5 规范中出现的数组方法。在平时的工作中,相信大家使用的场景并不多,一般而言,可以通过 reduce 方法实现的逻辑都可以通过 forEach 方法来变相的实现,虽然不清楚浏览器的js引擎是如何在C++层面实现这两个方法,但是可以肯定的是 reduce 方法肯定也存在数组的遍历,在具体实现细节上是否针对数组项的操作和存储做了什么优化,则不得而知。
reduce() 在数组中的应用:
reduce() 方法有两个参数,第一个参数是一个 callback,用于针对数组项的操作;第二个参数则是传入的初始值,这个初始值用于单个数组项的操作。需要注意的是,reduce 方法返回值并不是数组,而是形如初始值的经过叠加处理后的操作。
reduce() 方法最常见的场景就是叠加。
|
|
可以看出,reduce()函数根据初始值0,不断的进行叠加,完成最简单的总和的实现。
前文中也提到,reduce() 函数的返回结果类型和传入的初始值相同,上个实例中初始值为 number 类型,同理,初始值也可为 object 类型。
|
|
多重叠加:
使用 reduce() 方法可以完成多维度的数据叠加。如上例中的初始值 {sum: 0} ,这仅仅是一个维度的操作,如果涉及到了多个属性的叠加,如 {sum: 0,totalInEuros: 0,totalInYen: 0} ,则需要相应的逻辑进行处理。
在下面的方法中,采用分而治之的方法,即将 reduce() 函数第一个参数 callback 封装为一个数组,由数组中的每一个函数单独进行叠加并完成 reduce 操作。所有的一切通过一个 manager 函数来管理流程和传递初始参数。
|
|
上面就是 manager 函数的实现,它需要 reducers 对象作为参数,并返回一个 callback 类型的函数,作为 reduce 的第一个参数。在该函数内部,则执行多维的叠加工作(Object.keys())。
通过这种分治的思想,可以完成目标对象多个属性的同时叠加,完整代码如下:
|
|
当然,如果你更喜欢函数式编程的话
如果 Haskell 是 IPA 那么 JavaScript 就是 O'Douls。就是说,与 Haskell 不同,JavaScript 不是函数式编程语言,不过它仍然有一点函数式的意味。函数式语言更整洁也更容易测试,所以你最好能喜欢上这种编程风格。
一般 JavaScript 写法:
而函数式编程的写法:
是不是发现函数式编程更简单呢 ^__^ 希望可以爱上它 ♥