笔记:三个数组,把他们的所有组合穷举出来,最终得到这样一个数组

/*
需求描述起来很简单,有这样三个数组:
let names = ["iPhone X", "iPhone XS"]

let colors = ["黑色", "白色"]

let storages = ["64g", "256g"]
需要把他们的所有组合穷举出来,最终得到这样一个数组:
[
  ["iPhone X", "黑色", "64g"],
  ["iPhone X", "黑色", "256g"],
  ["iPhone X", "白色", "64g"],
  ["iPhone X", "白色", "256g"],
  ["iPhone XS", "黑色", "64g"],
  ["iPhone XS", "黑色", "256g"],
  ["iPhone XS", "白色", "64g"],
  ["iPhone XS", "白色", "256g"],
]
由于这些属性数组是不定项的,所以不能简单的用三重的暴力循环来求解了。
*/

let names = ["iPhone X", "iPhone XS"]

let colors = ["黑色", "白色"]

let storages = ["64g", "256g"]

// list的每一项和arr的每一项组合新的所有的情况,返回res
function getRes(list, arr) {
  let res = []

  list.forEach(i => {
    arr.forEach(j => {
      let curj = JSON.parse(JSON.stringify(j))
      curj.push(i)
      res.push(curj)
    })
  })

  return res
}

// [ [ 'iPhone X', 'iPhone XS' ], [ '黑色', '白色' ], [ '64g', '256g' ] ]
function get(...arr) {
  if (!Array.isArray(arr) || !arr.length) return '参数有误'
  let res = arr.shift() // 取第一个作为初始值,剩下的遍历
  res = res.map(i => [i])

  if (arr.length) {
    let cloneRes = JSON.parse(JSON.stringify(res)) // 这里深拷贝,有lodash的尽量使用deepClone
    arr.forEach(list => {
      cloneRes = getRes(list, cloneRes) // 递归轮循
    })
    res = cloneRes
  }
  
  return res
}

console.log(get(names, colors, storages))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值