二维数组求组合

文章介绍了如何使用JavaScript的reduce方法解决不定长二维数组的所有组合问题。通过将每对数组的组合结果合并,实现了对任意数量数组的组合计算。核心思路是每次都计算两数组的组合,然后将结果传递给下一个数组进行相同操作,直到处理完所有数组。
摘要由CSDN通过智能技术生成

给出不定长二维数组,求所有组合。
这个问题刚入行的时候解决过,现在又忘记了。现在做下记录。

  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]我们可以先计算arrOnearrTwo的组合。拿到结果后再和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'

这样就大功告成了。
个人见解,仅供参考。不当之处,多多包含。欢迎指出问题所在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值