@NiceScript

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

Необходимо создать функцию, которая создаёт массив пересечений элементов списков без дублей.
Например, есть списки:
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']  
  ]
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
@NiceScript Автор вопроса
Спасибо за подсказку про декартово произведение
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);
  }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы