JavaScript筆記:柯里化,資料扁平化
阿新 • • 發佈:2018-12-15
柯里化,扁平化
柯里化
在數學和電腦科學中,柯里化是一種將使用多個引數的一個函式轉換成一系列使用一個引數的函式的技術。
前端使用柯里化主要是為了簡化程式碼結構。提高系統的可維護性,一個方法,只有一個引數,強制了功能的單一性,使其功能內聚,降低了耦合。
function curry(fn, length){
var length = length || fn.length;
return function(){
if(arguments.length < length){
var combined = [fn].concat([].slice.call(arguments,0));
return curry(fixedParmaCurry.apply(this, combined), length - arguments.length)
}else{
return fn.apply(this,arguments);
}
}
}
function fixedParmaCurry(fn){
var args = [].slice.call(arguments,1);
return function(){
var newArg =args.concat([].slice. call(arguments,0));
return fn.apply(this, newArg);
}
}
function add(a, b, c, d){
return a + b + c +d;
}
var newAdd = curry(add);
var n1 = newAdd(1);
var n2 = n1(2);
console.log(n2(3, 4));
var a = fixedParmaCurry(add, 1,2);//function(){return fn.apply}
console.log(a(3, 4));//add.apply(this,newArg)
扁平化
var arr = [[2,3], 'haha',45,6, ['a', 'b', 'c'], 'hi', {name: 'jane'}];
function flatten(arr){
var arr = arr || [];
var res = [];
for(var i = 0, len = arr.length; i < len; i++){
Object.prototype.toString.call(arr[i]) == '[object Array]'? (res = res.concat(flattern(arr[i]))) : res.push(arr[i]);
}
return res;
}
// console.log(flatten(arr));
Array.prototype.flatten = function(){
var resArr = [];
this.forEach(function(item){
Object.prototype.toString.call(item) == '[object Array]'? resArr = resArr.concat(item.flatten()) : resArr.push(item);
})
return resArr;
}
console.log(arr.flatten());