So today at work, I needed to write a function to create a “pivot table”, given an arbitrary number of dimensions. With a defined number of dimensions, this was easy, but making it generic took some thinking. Here’s how I solved it:

/**

* Given a set of sets, this function will return all the combinations

* of those sets. For instance, say a shirt comes in sizes S, M, and L,

* and colors Black and White, and can be labeled with either Mom or Dad,

* this will return an array of arrays with the following:

* {

* {S, Black, Mom}

* {S, Black, Dad}

* {S, White, Mom}

* {S, White, Dad}

* {M, Black, Mom}

* …

* }

* The function can accept any number of sets to combine.

*/

function pivot(array){

if(array.length == 1){

var bottom = new Array();

for(var i = 0; i < array[0].length; i++){
bottom.push(new Array(array[0][i].toString()));
}
return bottom;
} else {
var myPivot = pivot(array.slice(1));
var newArray = new Array();
for(var i = 0; i < array[0].length; i++){
for(var j = 0; j < myPivot.length; j++){
var tempArray = myPivot[j].slice();
tempArray.unshift(array[0][i].toString());
newArray.push(tempArray);
}
}
return newArray;
}
}
[/javascript]