记一次递归解决数组对象排列组合的问题

期望效果如下图:
莫小奈博客
选择版本条件,罗列出可以组合的结果,如果哪一行没有选中元素,则没有结果。
实现过程:
原始数据:

cudaData:[
   {'decent_version':[{'decent_p':false},{'decent_q':false}]},
   {'system_version':[{'centos6':false},{'centos7':false},{'ubuntu14.04':false},{'ubuntu16.04':false}]},
   {'cuda_version':[{'cuda8.0':false},{'cuda9.0':false},{'cuda9.1':false}]},
   {'cudnn_version':[{'cudnn7.0.5':false}]},
],

其中false代表未选中,项目是vue写的
选择以及全选取消全选的代码就不贴了,下面是排列组合的核心函数

dealData(){
    let _this = this
    let dest = []
    _this.cudaData.forEach((item,index)=>{
        for(var key in item){
            let temArr = []
            item[key].forEach((kitem)=>{
                for(var keyword in kitem){
                    if(kitem[keyword]){
                        temArr.push(keyword)
                    }
                }
            })
            dest.push(temArr)
        }
    })
    _this.temArr = dest //缓存选中的数组
    _this.cudaList = [] //每次计算的时候,先把目标数组清空
    for (var i = 0; i < dest.length; i++) {
        if(dest[i].length==0){
            return //如果缓存的数组中,某一行有未选中的return
        }
    }
    _this.recur() //递归实现目标结果的排列组合
    console.log(_this.cudaList)
},
recur(){
    let _this = this
    let arr = _this.temArr.shift()
    if(arr && arr.length > 0){
        if(_this.cudaList.length==0){
            _this.cudaList = arr  //如果是第一行
        }else{
            let dest = []
            _this.cudaList.forEach((x)=>{
                arr.forEach((y)=>{
                    dest.push(x+"-"+y)
                }) 
            })
            _this.cudaList = dest
        }
        _this.recur() //递归
    }
}

折腾了半天,终于解决了。

未经允许不得转载:莫小奈博客 » 记一次递归解决数组对象排列组合的问题

评论 1

评论前必须登录!

登陆 注册
  1. 巨根增大网让人百看不厌的博客,真的不是很多!