谁能给简化一下这个for循环代码

CodePen代码示例

请自行清除注释查看效果。

最后希望是2个参数,
第一个数组集合。
第二个是数字(可选),如果没有,就循环整个数组,数字的意义是控制循环到哪个字母,比如只组合到D,就是4(或者3)。

2020.07.01 更新

或者第二个参数,控制生成字母组合的位数,比如生成2个字母的组合,或者生成3个字母的组合。

A等于1
B等于2
C等于4
D等于8
E等于16
F等于32
G等于64
H等于128
I等于256
依次类推,直到Z为止,这是原始数据吧,然后生成的字母组合,来对应字母组合相加的数值(运算结果)。
当然,字母排列也是有一定规律的,就是只会按从A到Z的顺序排列,然后组合只会出现下表中左侧的格式,而不会出现右侧的格式:

正确格式 错误格式
AB BA
AC CA
BC CB
BE EB
ABC ACB
ABD BAD
BCD DCB
... ...

希望说清楚了,汗颜抱歉,之前没有描出清楚问题。

阅读 2.3k
3 个回答

估计你需要把你 想的 需要 用数据或者用例的形式 描述出来,而不是给一大段代码,还让人去分析。
我猜,你是想有一个 特征数据集(数组集合), 然后从中抽取任意n个数据组合(不重复),对应的特征结果。
这个其实是组合遍历的问题。

// 未优化开始
function getStart(k,m){
    let rt=0;
    let bitMark=0x1;
    for(let i=0;i<k-1;i++){
        rt=rt | (bitMark<<i)
    }
    rt = rt | (bitMark<<(m-1))
    return rt;
}
var cc=0;
var CharA="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split('');
function FmtOut(inNum,M){
    let inNumToB=inNum.toString(2);
    let rt="";
    for(let i=0;i<M;i++){
        if(inNum & (0x1<<i) ){
            rt=rt+CharA[i];
        }
    }
    rt=rt+" : "+ inNumToB+"b = "+ inNum
    console.log(rt);
}
function get1Num(i, m){ // 获取m位数i中为1的位数
    let rt=0;
    let bitMark=0x1;
    for(let j=0;j<m;j++){
        rt = rt+ ( ( ( bitMark<<j ) & i )>>j );//i的第j位是否为1
    }
    return rt;
}

function BCMK(M,K){
    let StartNum=getStart(K,K);
    let EndNum=StartNum<<(M-K);
    for(let i=StartNum;i<=EndNum;i++){
        if(get1Num(i,M)==K){
            FmtOut(i,M);
            cc++;
        }
    }
}
BCMK(16,6)
//未优化结束

我提供一个参考:

let arr=['a','b','c','d','e'];
console.log(tree_all(arr));


function tree_all(arr,len){
    len=len>0?(arr.length<len?arr.length:len):arr.length;
    var re=[];
    arr.forEach(v=>{
        re.push(v);
    })
    for(let i=1;i<len;i++){
        re=add_letter(re,arr);
    }
    return re;
}

function add_letter(re,arr){
    var r=[];
    re.forEach(v=>{
        arr.forEach(vv=>{
            r.push(v+vv);
        })
    })
    return r;
}

没理解你的代码要干嘛。而且你有多少个循环都没有说清楚。
你的循环有重复代码,可以写回调函数。然后你输入一个数字,在数组范围内,进行回调。你的循环里面其实逻辑是很多重复的。可以抽出来到迭代函数里面。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题