Crie uma matriz com todas as combinações exclusivas

Não consigo descobrir como criar uma matriz com todas as correspondências. Eu suponho que eu precise de uma função recursiva para isso.

Eu gosto de obter todos os valores do JSON abaixo e criar um array com todas as combinações de valores. Pode haver mais ou menos modelos (Name4) e mais ou menos valores. Qualquer ajuda?

var models = [
    {
        name: 'Name1',
        values: [
            'Title1Value1',
            'Title1Value2',
            'Title1Value3'
        ]
    },
    {
        name: 'Name2',
        values: [
            'Title2Value1',
            'Title2Value2'
        ]
    },
    {
        name: 'Name3',
        values: [
            'Title3Value1',
            'Title3Value2'
        ]
    }
];

// Output array
var matches = [
    [ 'Title1Value1', 'Title2Value1', 'Title3Value1' ],
    [ 'Title1Value1', 'Title2Value1', 'Title3Value2' ],
    [ 'Title1Value1', 'Title2Value2', 'Title3Value1' ],
    [ 'Title1Value1', 'Title2Value2', 'Title3Value2' ],
    [ 'Title2Value2', 'Title2Value1', 'Title3Value1' ],
    [ 'Title1Value2', 'Title2Value1', 'Title3Value2' ],
    [ 'Title1Value2', 'Title2Value2', 'Title3Value1' ],
    [ 'Title1Value2', 'Title2Value2', 'Title3Value2' ],
    [ 'Title1Value3', 'Title2Value1', 'Title3Value1' ],
    [ 'Title1Value3', 'Title2Value1', 'Title3Value2' ],
    [ 'Title1Value3', 'Title2Value2', 'Title3Value1' ],
    [ 'Title1Value3', 'Title2Value2', 'Title3Value2' ]
];

questionAnswers(1)

yourAnswerToTheQuestion