こうこく
作 ▸

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'],
];

関数にしました。

expand
/**
 * 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"]
] */
この記事に何かあればこちらまで (非公開)