code: function cartesian( ...arrays ) {
  	let i, j, l, m;
  	const o = [];
  
  	if ( ! arrays || arrays.length === 0 ) {
  		return arrays;
  	}
  	const array1 = arrays.splice( 0, 1 )[ 0 ];
  	arrays = cartesian( ...arrays );
  	for ( i = 0, l = array1.length; i < l; i++ ) {
  		if ( arrays && arrays.length ) {
  			for ( j = 0, m = arrays.length; j < m; j++ ) {
  				o.push( [ array1[ i ] ].concat( arrays[ j ] ) );
  			}
  		} else {
  			o.push( [ array1[ i ] ] );
  		}
  	}
  	return o;
  }
docs: http://stackoverflow.com/a/29585704