为了账号安全,请及时绑定邮箱和手机立即绑定

从具有m个元素的n个数组生成JavaScript组合

从具有m个元素的n个数组生成JavaScript组合

炎炎设计 2019-07-02 17:33:30
从具有m个元素的n个数组生成JavaScript组合在JavaScript中,我很难想出从n个数组中生成包含m个元素的数组组合的代码。对于其他语言,我也看到过类似的问题,但答案包含了语法或库魔法,我不知道如何翻译。考虑以下数据:[[0,1], [0,1,2,3], [0,1,2]]3数组,其中包含不同数量的元素。我想要做的是通过组合每个数组中的一个项来获得所有的组合。例如:0,0,0 // item 0 from array 0, item 0 from array 1, item 0 from array 20,0,10,0,20,1,00,1,10,1,20,2,00,2,10,2,2诸若此类。如果数组的数目是固定的,那么就很容易实现硬编码。但是数组的数量可能有所不同:[[0,1], [0,1]][[0,1,3,4], [0,1], [0], [0,1]]任何帮助都将不胜感激。
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

下面是一个使用递归帮助函数的简单而简短的函数:

function cartesian() {
    var r = [], arg = arguments, max = arg.length-1;
    function helper(arr, i) {
        for (var j=0, l=arg[i].length; j<l; j++) {
            var a = arr.slice(0); // clone arr
            a.push(arg[i][j]);
            if (i==max)
                r.push(a);
            else
                helper(a, i+1);
        }
    }
    helper([], 0);
    return r;}

用法:

cartesian([0,1], [0,1,2,3], [0,1,2]);

要使函数接受数组,只需将签名更改为function cartesian(arg)所以arg是一个参数,而不是arguments.


查看完整回答
反对 回复 2019-07-02
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您可以通过构建子数组来采取迭代的方法。


var parts = [[0, 1], [0, 1, 2, 3], [0, 1, 2]],

    result = parts.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []));


console.log(result.map(a => a.join(', ')));

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 658 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信