var pipe = function (value) {
var funcStack = [];
var oproxy = new Proxy({} , {
get : function (pipeObject, fnName) {
if (fnName === 'get') {
return funcStack.reduce(function (val, fn) {
return fn(val);
},value);
}
funcStack.push(window[fnName]);
return oproxy;
}
});
return oproxy;
}
var double = n => n * 2;
var pow = n => n * n;
var reverseInt = n => n.toString().split("").reverse().join("") | 0;
pipe(3).double.pow.reverseInt.get; // 63
Overview
语法:
array.reduce(function(total, currentValue, currentIndex, arr), [initialValue])
reduce()
方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。reduce()
方法可以完成的功能,for
循环,或者forEach
、map
方法也可以完成,total
为累积变量,currentValue
当前数组成员的值把循环遍历算法与累加器算法分离开来
一、求和
注意第一个参数是如何来的。
initialValue
,initialValue
为 累加器的初始值,遍历从arr[0]
的第一个元素开始, 迭代arr.length
次initialValue
,arr[0]
为累加器的初始值,遍历从arr[1]
开始, 迭代arr.length -1
次对象数组中的属性求和
二、求数组最大值
三、统计数组中重复的元素
initialValue
是一个空对象prev[next] = (prev[next] + 1) || 1;
主要是运用短路表达式的隐式转换,prev[next]
为undefined
,(prev[next] + 1)
为NaN
,可以隐式转换为false
, 取1prev[next]
不为undefined
(prev[next]
必然为initialValue
里的一个属性的值)参考 JavaScript 中的逻辑运算符和短路表达式
四、数组去重
initialValue
是一个空数组PS: 在
ES6
中使用Set
数据结构和数组的扩展运算符(...), 参考 Set 和 Map 数据结构五、链式操作
这段用 数组实例方法
reduce
和ES6
原生提供的Proxy
,可以将读取属性的操作(get),转变为执行某个函数,从而实现属性的链式操作。pipe(3)
返回一个Proxy
实例oproxy
oproxy
的double
属性,即在new Proxy
内的handler
中 ,fnName = double
, 将顶层对象window
下的全局变量dobule
函数 放到数组中