I made a few changes to your code. It works:
var data = [
['one','two','three'],
['four', 'five', ['six']],
'seven',
['eight', 'nine']
]
function flatten(arr) {
return arr.reduce(function(ret, curr) {
return ret.concat(Array.isArray(curr) ? flatten(curr) : [curr])
}, [])
}
var functionalFlatten = reduceWith(function(ret, curr) {
return Array.prototype.concat.call(ret, Array.isArray(curr) ? functionalFlatten(curr) : [curr])
}, [])
var _functionalFlatten = reduceWith(function(ret, curr) {
return ret.concat(ret, Array.isArray(curr) ? functionalFlatten(curr) : [curr])
}, [])
function reduceWith(fn, initial) {
return (function (arr) {
return Array.prototype.reduce.call(arr, fn, initial)
})
}
function _reduceWith(fn, initial) {
return (function (arr) {
return arr.reduce(fn, initial)
})
}
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))
Now to the real problem ...
var functionalFlatten = reduceWith(function( ret, curr ){
if( Array.isArray( curr ) ){
ret = ret.concat( functionalFlatten( curr ) );
} else {
ret.push( curr );
}
return ret;
}, []);
reduceWith ( functionalFlatten).- ...
ret.push(curr) initial
...
function reduceWithMutationSafe(fn, initial) {
return (function (arr) {
var clonedInitial = eval(JSON.stringify(initial))
return arr.reduce(fn, clonedInitial)
})
}
var functionalFlatten = reduceWithMutationSafe(function(ret, curr) {
if(Array.isArray(curr)) {
ret = ret.concat(functionalFlatten(curr))
} else {
ret.push(curr)
}
return ret
}, [])
, functionalFlatten , .
ret.push(curr) initial,
.
. reduceWithMutationSafe.