Привет спасибо за чтение.
У меня есть несколько входов «меток» (или чипов) с возможностью добавления дополнительных входов тегов. Таким образом, пользователь может получить, скажем, 3 входа, например:
(у них может быть только два входа тегов, но с 4 или 5 тегами каждый, или у них может быть 5 входов тегов только с 1 или 2 тегами)
Мне нужен список, который сопоставляет каждое значение с другим:
На данный момент мой код статичен:
this.optionTypes[0].options.forEach((subOption: string) => {
this.optionTypes[1].options.forEach((subOption1: string) => {
this.optionTypes[2].options.forEach((subOption2: string) => {
this.optionList.push({
name: subOption + ' / ' + subOption1 + ' / ' + subOption2
});
});
});
}
Но мне нужно иметь возможность рекурсивно перебирать многие входные данные, независимо от того, сколько опций они добавляют или тегов, которые они добавляют в опции.
Спасибо за помощь.
Поскольку вы не предоставили воспроизводимый пример своего кода, я предполагаю, что это должно помочь:
this.optionTypes.forEach((subOption: string) => {
subOption.options.forEach((subOption: string) => {
// some code
}
}
Не уверен, что вам нужно использовать рекурсию здесь
То, что вы ищете, называется декартовым произведением массивов. Есть несколько хороших способов их расчета. Вот рекурсивная версия
const cartesian = ([xs, ...xss]) =>
xs = undefined
? []
: xss.length == 0
? xs .map (x => [x])
: xs .flatMap (x => cartesian (xss) .map (ys => [x, ...ys]))
console .log (
cartesian ([
['red', 'green'],
['small', 'large'],
['mens', 'ladies'],
])
)
.as-console-wrapper {max-height: 100% !important; top: 0}
Но вы также можете написать это с помощью двойного reduce
, например:
const cartesian = ([x, ...xs]) =>
(xs || []) .reduce (
(a, b) => a .reduce (
(c, d) => [... c, ... (b .map (e => [... d, e]))],
[]
),
(x || []) .map (x => [x])
)
@Yoshi: У вас был интересный ответ на этот вопрос, касающийся генераторов. Я не проверял, но похоже, что это сработает. Зачем удалять ответ?