Как пересечь списки без дублей? (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));