(Returns all combinations for one or more arrays)
function* cartesian(arrays) { let remainder = arrays.length > 1 ? cartesian(arrays.slice(1)) : [[]]; for (let r of remainder) for (let h of arrays[0]) yield [h, ...r]; } const data = Array.from(cartesian([ ['A', 'B', 'C'], [1, 2, 3, 4], ['I', 'II'] ])); console.log(data); data.sort(); console.log(data);
In Typescript
function* cartesian<T>(arrays: T[][]): Generator<T[]> { const remainder = arrays.length > 1 ? cartesian(arrays.slice(1)) : [[]]; for (let r of remainder) { for (let h of arrays[0]) { yield [h, ...r]; } } }
Output:
[ [ 'A', 1, 'I' ], [ 'B', 1, 'I' ], [ 'C', 1, 'I' ], [ 'A', 2, 'I' ], [ 'B', 2, 'I' ], [ 'C', 2, 'I' ], [ 'A', 3, 'I' ], [ 'B', 3, 'I' ], [ 'C', 3, 'I' ], [ 'A', 4, 'I' ], [ 'B', 4, 'I' ], [ 'C', 4, 'I' ], [ 'A', 1, 'II' ], [ 'B', 1, 'II' ], [ 'C', 1, 'II' ], [ 'A', 2, 'II' ], [ 'B', 2, 'II' ], [ 'C', 2, 'II' ], [ 'A', 3, 'II' ], [ 'B', 3, 'II' ], [ 'C', 3, 'II' ], [ 'A', 4, 'II' ], [ 'B', 4, 'II' ], [ 'C', 4, 'II' ] ] [ [ 'A', 1, 'I' ], [ 'A', 1, 'II' ], [ 'A', 2, 'I' ], [ 'A', 2, 'II' ], [ 'A', 3, 'I' ], [ 'A', 3, 'II' ], [ 'A', 4, 'I' ], [ 'A', 4, 'II' ], [ 'B', 1, 'I' ], [ 'B', 1, 'II' ], [ 'B', 2, 'I' ], [ 'B', 2, 'II' ], [ 'B', 3, 'I' ], [ 'B', 3, 'II' ], [ 'B', 4, 'I' ], [ 'B', 4, 'II' ], [ 'C', 1, 'I' ], [ 'C', 1, 'II' ], [ 'C', 2, 'I' ], [ 'C', 2, 'II' ], [ 'C', 3, 'I' ], [ 'C', 3, 'II' ], [ 'C', 4, 'I' ], [ 'C', 4, 'II' ] ]
356800cookie-checkJavascript Cartesian Product