riando combinações em JavaScri

Digamos que eu tenha vários conjuntos de opções em Javascript

var color  =  ["red", "blue", "green","yellow"];
var size   =  ["small", "medium", "large"];
var weight =  ["heavy", "light"];

o que é um algoritmo eficiente para obter todas as combinações dessas opções em uma matriz que se parece com isso

["red and small and heavy", "red and small and light", "red and medium and heavy" ...]

Aqui está a ressalva embora

Esta função deve poder aceitar qualquer número de conjuntos de opções

Tenho a sensação de que a maneira correta de fazer isso é através de algum tipo de passagem de árvore, mas é muito cedo para ter pensado completamente nisso e ainda não tomei meu café

questionAnswers(4)

yourAnswerToTheQuestion