Edd Mann Developer

Cartesian Product in JavaScript

This weekend I have had the chance to explore Cartesian products. The Cartesian product (cross-product) is essentially an operation which returns a product set from multiple supplied sets. When applied to more than a pair of sets it can be typically described as the n-fold Cartesian product. Below is a simple JavaScript implementation which codifies this operation in an immutable, functional manner.

const flatten = (arr) => [].concat.apply([], arr);

const product = (...sets) =>
  sets.reduce((acc, set) =>
    flatten(acc.map(x => set.map(y => [ ...x, y ]))),
    [[]]);

product(
  ['small', 'medium', 'large'], 
  ['red', 'green', 'blue'], 
  ['shirt', 'jeans', 'shoes']);
  // [["small", "red", "shirt"], ["small", "red", "jeans"] ...