Декартовы комбинации для вариантов компонентов

Допустим, у меня есть объект, определяющий входные данные для компонента кнопки и возможные значения этого ввода.

const buttonVariants = {
  colorMode: ['on-dark','on-light'],
  size: ['small','medium','large']
};

Как я могу создать декартову функцию для создания шаблонов для всех возможных комбинаций вариантов? Я хотел бы иметь возможность повторно использовать эту функцию для нескольких компонентов, поэтому важно указать, что мне нужно, чтобы она работала для n вариантов.

Я надеюсь добиться чего-то вроде этого, но где будет результат:

[
  '<button colorMode = "on-dark" size = "small">button</button>',
  '<button colorMode = "on-dark" size = "medium">button</button>',
  '<button colorMode = "on-dark" size = "large">button</button>',
  '<button colorMode = "on-light" size = "small">button</button>',
  '<button colorMode = "on-light" size = "medium">button</button>',
  '<button colorMode = "on-light" size = "large">button</button>'
]

что ты уже испробовал?

Prerak Sola 12.03.2024 21:46

Кажется, вы могли бы использовать пример, на который вы ссылаетесь, а затем сопоставить его для получения желаемого результата.

mykaf 12.03.2024 21:47

Как насчет того, чтобы попробовать вложенный цикл? Для всех цветовых режимов выполните цикл по всем размерам и создайте включенный результат.

Kostas Minaidis 12.03.2024 21:48

Вы можете напрямую изменить приведенный вами пример: демо — свести эти результаты в массив строк не займет много времени.

paddy 12.03.2024 21:51

почему бы не сделать вот так: stackoverflow.com/q/54343749/1447675

Nina Scholz 12.03.2024 22:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать Array::flatMap() для сопоставления всех комбинаций цвета/размера:

const buttonVariants = {
  colorMode: ['on-dark','on-light'],
  size: ['small','medium','large']
};

const buttons = buttonVariants.colorMode.flatMap(c => 
  buttonVariants.size.map(s => `<button colorMode = "${c}" size = "${s}">button</button>`)
);

console.info(buttons);
Ответ принят как подходящий

Этого можно добиться, сначала создав универсальную функцию для генерации декартова произведения нескольких массивов. Эта функция будет полезна для генерации всех возможных комбинаций имеющихся у вас вариантов. Затем вы можете сопоставить эти комбинации для создания нужных шаблонов кнопок. Давайте реализуем это на JavaScript:

function cartesianProduct(arrays) {
    return arrays.reduce((acc, currentValue) => 
        acc.flatMap(c => currentValue.map(value => [...c, value])), 
        [[]]);
}

function generateButtonTemplates(variants) {
    // Extract variant keys and their possible values
    const keys = Object.keys(variants);
    const values = keys.map(key => variants[key]);
    
    // Generate all combinations of variant values
    const combinations = cartesianProduct(values);
    
    // Map each combination to a button template
    return combinations.map(combination => {
        const attributes = combination.map((value, index) => `${keys[index]} = "${value}"`).join(' ');
        return `<button ${attributes}>button</button>`;
    });
}

const buttonVariants = {
  colorMode: ['on-dark', 'on-light'],
  size: ['small', 'medium', 'large']
};

console.info(generateButtonTemplates(buttonVariants));

Запустив этот код, вы получите выходные данные в указанном вами формате, что позволит вам создавать шаблоны для всех возможных комбинаций вариантов.

Другие вопросы по теме