给出不定长二维数组,求所有组合。
这个问题刚入行的时候解决过,现在又忘记了。现在做下记录。
const arr = [["a", 'b'], [1, 2], ['A', 'B','C'],];
省流–最终代码
const arr = [["a", 'b'], [1, 2], ['A', 'B', 'C'],];
function count(ArrData){
return ArrData.reduce((p, c) => {
const temArr = []
p.forEach((item) => {
c.forEach((col) => {
temArr.push(item + col)
})
})
return temArr
}, [''])
}
console.log(count(arr))
解题思路:
- 假使为两个数组求组合:
const arrOne = ['a','b']
const arrTwo = [1,2]
- 很容易想到的组合实现方式:
const arr = []
arrOne.forEach((item) => {
arrTwo.forEach((row) => {
arr.push(item + row)
})
})
console.log(arr) // ['a1', 'a2', 'b1', 'b2']
- 假使为三个数组求组合:
const arrOne = ['a','b']
const arrTwo = [1,2]
const arrTwo = ['A', 'B','C']
- 组合实现方式:
const arr = []
arrOne.forEach((item) => {
arrTwo.forEach((row) => {
arrThree.forEach((value) => {
arr.push(item + row + value)
})
})
})
console.log(arr) // ['a1A', 'a1B', 'a1C', 'a2A', 'a2B', //'a2C', 'b1A', 'b1B', 'b1C', 'b2A', 'b2B', 'b2C']
- 但是实际过程中数组是不定长的。但是仔细看数组长度为二的时候的组合代码和三个数组的代码作对比。我们就会发现有一部分重复代码。
arrOne.forEach((item) => {
arrTwo.forEach((row) => {
//---------------------------
// 此处得到的是['a1', 'a2', 'b1', 'b2']是数组为二的结果
// 分割线内是第三次循环
arrThree.forEach((value) => {
arr.push(item + row)
})
//---------------------------
})
})
- 此时可以想到,我们不需要关心数组有多长,我们只需要计算数组前两项的组合就行。就好比数组 [arrOne,arrTwo,arrThree]我们可以先计算arrOne和arrTwo的组合。拿到结果后再和arrThree计算,每次我们只需要计算两项的组合。这样问题就会迎刃而解。
- 我们第一个想到的应该是用reduce方法。
// 首先定义一个获取两项二维数组的组合
function getRes(firstArr,secondArr) {
const temArr = [];
firstArr.forEach((item) => {
secondArr.forEach((row) => {
temArr.push(item + row)
})
})
return temArr
}
// 然后通过reduce获取组合
const newArr = arr.reduce((p,c)=>{
return getRes(p,c)
},[''])
console.log(newArr,'newArr')
// ['a1A', 'a1B', 'a1C', 'a2A', 'a2B', 'a2C', 'b1A', 'b1B', // 'b1C', 'b2A', 'b2B', 'b2C'] 'newArr'
这样就大功告成了。
个人见解,仅供参考。不当之处,多多包含。欢迎指出问题所在。