js按规则将三个数组合成一个二维数组?

直接上代码:

var a1 = [1,2,3] ;
var a2 = [4,5,6] ;
var a3 = [7,8] ;

需要的结果:
[ [1,4,7],[1,4,8],[1,5,7],[1,5,8],[1,6,7],[1,6,8]... ] (共18个)

这种循环要如何实现?

var a1 = [1,2,3];
var a2 = [4,5,6];
var a3 = [7,8];

        for(var i = 0; i < a1.length; i ++) {
            for(var j = 0; j < a2.length; j ++) {
                for(var k = 0; k < a3.length; k ++) {
                    var arr = [a1[i],a2[j],a3[k]];
                    console.log(arr);
                }
            }
        }

var x = 0;
var y = 0;
var z = 0;

        while (a1[x]) {
            var arr = [a1[x], a2[y], a3[z]];
            console.log(arr);
            z ++;
            if(!a3[z]){z = 0; y ++;}
            if(!a2[y]){y = 0; x ++;}
        }
        这个也行

var a1 = [0,1,2,3,4,5,6,7,8] ;
需要的结果:
0 3 6 ...
1 4 7
2 5 8
这种循环要如何实现?