问题描述
给出数组如:[['a','b','c'],['d','e'],['f','g']…..]
输出:['adf','adg','aef','aeg','bdf','bdg','bef','beg','cdf','cdg','cef','ceg']
var groupEm = function (array) {
//填写你的代码
}
var arr = [['a','b','c'],['d','e'],['f','g']]
groupEm(arr) //['adf','adg','aef','aeg','bdf','bdg','bef','beg','cdf','cdg','cef','ceg']
程序如下:
1.基础代码
var groupEm = function(array) {
//填写你的代码
while(array.length>1) { //当array 中多于一个数组
var sub1 = array.pop()
var sub2 = array.pop()
var res = []
var ne = []
sub2.forEach(function(item1) {
ne = sub1.map(function(item2) { //组合两个数组中的元素并存入新数组
return item1 + item2
})
res = res.concat(ne)
})
array.push(res) //将sub1和sub2元素组合构成的数组加入array末尾
}
return array
}
2.优化代码,使其符合函数式编程风格
函数式编程的突出特征可总结为:
- 纯函数 --- 对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态。
- 变量不变性
- 只用“表达式”,不用“语句”
- 闭包
- 函数柯里化:传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
var groupEm = function(arr1) {
//填写你的代码
//柯里化
return function() {
array = arguments.length ? arr1.concat(arguments[0]) : arr1
function iterators(arrs,last) {
if(arrs.length === 0) {
return last
}
var sub1 = last.length ? last : arrs.pop()
var sub2 = arrs.pop()
function combine(pre,aft,set) {
if(pre.length === 0) {
return set
}
var item1 = pre.shift()
var r = aft.map(function(item2) { //组合两个数组中的元素并存入新数组
return item1 + item2
})
return combine(pre,aft,set.concat(r))
}
iterators(arrs,combine(sub2,sub1,[]))
}
iterators(array,[]) //尾递归
}
}
3.如果数组中出现[[“a”,”b”,”c”],[“a”,”d”]]要求去掉”aa”这种情况,即结果中的每个组合不存在重复字符?
------ 使用filter ------
var groupEm = function(array) {
//填写你的代码
while(array.length>1) {
var sub1 = array.pop()
var sub2 = array.pop()
var res = []
var ne = []
sub2.forEach(function(item1) {
var s = sub1.filter(function(item2) {
return item1 !== item2
})
ne = s.map(function(item2) {
return item1+item2
})
res = res.concat(ne)
})
array.push(res)
}
return array
}
------ 不使用filter ------
var groupEm = function(array) {
//填写你的代码
while(array.length>1) {
var sub1 = array.pop()
var sub2 = array.pop()
var res = []
sub2.forEach(function(item1) {
var ne = []
sub1.forEach(function(item2) {
if(item1 !== item2)
ne.push(item1+item2)
})
res = res.concat(ne)
})
array.push(res)
}
return array
}