题
给定如下一个二维数组,进行排列组合,输出如下形式的一维数组。
输入:
[
['a', 'b', 'c', ...],
[1, 2, 3, ...],
['x', 'y', 'z', ...],
...
];
输出
[‘a1x’, ‘a1y’, ‘a1z’, …]
一面遇到的一道面试题,当场蒙圈了,过于紧张,愣是没写出来。
痛定思痛,埋头思考,想到了一种解法,欢迎交流。
解
如果二维数组只存在两个一维数组,会怎么做呢?
使用嵌套的for
function compose(arr1, arr2) {
let newArr = [];
for (let v1 of arr1) {
for (let v2 of arr2) {
newArr.push(`${v1}${v2}`);
}
}
return newArr;
}
let newArr = compose(arr[0], arr[1]);
如果二维数组中存在三个一维数组,那么就可以将上次合并的结构和第三个一维数组再次进行合并
let newArr = compose(arr[0], arr[1]);
newArr = compose(newArr, arr[2]);
// 或者
let newArr = compose(compose(arr[0], arr[1]), arr[2]);
// 如果存在4个一维数组
let newArr = compose(compose(compose(arr[0], arr[1]), arr[2]), arr[3]);
以此类推,就可以完成多个一维数组的排列组合。
但是上述方法对于二维数组中存在N个一维数组情况无法实现。因此就需要使用递归来解决这个问题。
function exec(length) {
if (length <= 2) { // 确定临界值
return compose(arr[length - 2], arr[length - 1])
}
return compose(exec(length - 1), arr[length - 1])
}
const arr = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z'], [4, 5, 6]];
let newArr = exec(arr.length);
更新于20201231
正好看了redux中对于中间件的组合,萌生了一个新思路。借助于reduce函数的特性实现
let newArr = arr.reduce((pre, cur) => {
return compose(pre, cur);
});
console.log(newArr);