Как пересечь списки без дублей? (javascript)

Необходимо создать функцию, которая создаёт массив пересечений элементов списков без дублей на javascript. Например, есть списки:

let lists = [
       {
          label: 'Цвет',
          values: [ 'Красный', 'Зелёный', 'Синий' ]
        },
        {
          label: 'Размер',
          values: [ 'L', 'M', 'S' ]
        },
        {
          label: 'Вырез футболки',
          values: [ 'V', 'O' ]
        }
    ]

Списки нужно пересечь между собой без дублей.

getMatrix(lists) { 
   // ЧТО ТУТ ДОЛЖНО БЫТЬ, ЧТОБЫ ВЫДАЛО МАССИВ ПЕРЕСЕЧЕНИЙ БЕЗ ДУБЛЕЙ
}

Результат функции

[
    ['Красный', 'L', 'V'],
    ['Зелёный', 'L', 'V'],
    ['Синий', 'L', 'V'],
    ['Красный', 'M', 'V'],
    ['Зелёный', 'M', 'V'],
    ['Синий', 'M', 'V'],
    ['Красный', 'S', 'V'],
    ['Зелёный', 'S', 'V'],
    ['Синий', 'S', 'V'],
    ['Красный', 'L', 'O'],
    ['Зелёный', 'L', 'O'],
    ['Синий', 'L', 'O'],
    ['Красный', 'M', 'O'],
    ['Зелёный', 'M', 'O'],
    ['Синий', 'M', 'O'],
    ['Красный', 'S', 'O'],
    ['Зелёный', 'S', 'O'],
    ['Синий', 'S', 'O']  
  ]

Ответы (2 шт):

Автор решения: Tasty Script

Нашёл таки, это декартово произведение.

function genMatrix (options) {
    let ar = []
    options.forEach(item => ar.push(item.values))
    const f = (a, b) => [].concat(...a.map(d => b.map(e => [].concat(d, e))));
    const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a);
    return cartesian(...ar);
  }
→ Ссылка
Автор решения: Leonid
let lists = [
       {
          label: 'Цвет',
          values: [ 'Красный', 'Зелёный', 'Синий' ]
        },
        {
          label: 'Размер',
          values: [ 'L', 'M', 'S' ]
        },
        {
          label: 'Вырез футболки',
          values: [ 'V', 'O' ]
        }
    ];


function getMatrix(lists){
    let prevs = [...lists[0].values];
    prevs = prevs.map(item => [item]);
    let temps = [];

    for(let i=1; i<lists.length; i++){
        prevs.forEach(arr => {
        lists[i].values.forEach(val => {
            let arr1 = [...arr];
          arr1.push(val);
          temps.push(arr1);
        })
    })
    prevs = [...temps];
    temps = [];
}

return prevs;
}

console.log(getMatrix(lists));
→ Ссылка