【发布时间】:2016-04-05 17:08:45
【问题描述】:
在使用函数式编程原理从通用 reduce 函数生成 flatten 函数时,我无法从数组 flatten 函数中获取不正确的值。我相信这是因为调用中的递归存在问题,但我不确定如何通过它,因为工作和非工作函数的函数签名应该是相同的。
感谢您的帮助。
var data = [['one','two','three'], ['four', 'five', ['six']], 'seven', ['eight', 'nine']];
// here is an example of flatten that works perfectly. it takes an array and reduces
// the internal arrays to a single flat array
function flatten( arr ){
return arr.reduce(function( ret, curr ){
if( Array.isArray( curr ) ){
ret = ret.concat( flatten( curr ) );
} else {
ret.push( curr );
}
return ret;
}, []);
}
// here is what I am trying to achieve. This one combines my reduction functon with the
// functional `reduceWith` function. The code signature is exactly the same, however the
// end result is different.
// `functionalFlatten` does resolve to the correct function inside
var functionalFlatten = reduceWith(function( ret, curr ){
if( Array.isArray( curr ) ){
ret = ret.concat( functionalFlatten( curr ) );
} else {
ret.push( curr );
}
return ret;
}, []);
// this function will return a functional reduction function
function reduceWith( fn, initial ) {
return function _reduceWith( arr ) {
return Array.prototype.reduce.call(arr, fn, initial || []);
}
}
console.log('data', data);
console.log('functionalFlatten', functionalFlatten );
console.log('normal', flatten( data ));
console.log('fuctional', functionalFlatten( data ));
<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>
【问题讨论】:
-
你签出Ramda了吗?
-
不,从来没有见过那个图书馆。会检查出来。感谢您的提醒。
标签: javascript recursion functional-programming