作 ▸
2次元配列を総当たりのパターンに展開
// これを…
const before = [['A','B'], ['C','D','E'], ['F','G']];
// こう
const after = [
['A','C','F'],
['B','C','F'],
['A','D','F'],
['B','D','F'],
['A','E','F'],
['B','E','F'],
['A','C','G'],
['B','C','G'],
['A','D','G'],
['B','D','G'],
['A','E','G'],
['B','E','G'],
];
関数にしました。
/**
* 2次元配列を総当たりのパターンに展開したものを返却
* @param {Array} arr - 2次元配列
* @return {Array} 展開済み1次元配列
*/
const expand = (arr) => {
const expandedArr = [];
const len = arr.length;
const ps = (new Array(len)).fill(0);
let end = false;
while (!end) {
const elem = [];
for (let i = 0; i < len; ++i) {
elem.push(arr[i][ps[i]]);
}
expandedArr.push(elem);
for (let i = 0; i < len; ++i) {
if (++ps[i] < arr[i].length) {
break;
} else {
if (i >= len - 1) {
end = true;
}
ps[i] = 0;
}
}
}
return expandedArr;
};
const arr = expand([['A','B'], ['C','D','E'], ['F','G']]);
console.log(arr);
/* -> [
0: (3) ["A", "C", "F"]
1: (3) ["B", "C", "F"]
2: (3) ["A", "D", "F"]
3: (3) ["B", "D", "F"]
4: (3) ["A", "E", "F"]
5: (3) ["B", "E", "F"]
6: (3) ["A", "C", "G"]
7: (3) ["B", "C", "G"]
8: (3) ["A", "D", "G"]
9: (3) ["B", "D", "G"]
10: (3) ["A", "E", "G"]
11: (3) ["B", "E", "G"]
] */