我需要生成三个字符串数组的所有可能组合(样式、颜色、房间类型)……给定这3个字符串数组:
const stylesArray = ['modern'];
const colorsArray = ['blue', 'white'];
const typesArray = ['kitchen', 'living room', 'bedroom'];输出数组应包含以下值:
modern
blue
white
kitchen
living room
bedroom
modern-blue
modern-white
modern-kitchen
modern-living room
modern-bedroom
modern-blue-kitchen
modern-white-kitchen
...以此类推。这些组合仅在给定的顺序(样式、颜色、房间类型)中有效。请注意,每个数组中只有一个或两个元素也是有效的。我找到了一些帖子,你可以将这三种情况结合起来,但不是我刚才提到的最后一个条件。
这里的目标是能够基于每个“类别”(样式、颜色、房间类型)的那些给定值来验证所提供的slug是否有效。但这些值不是硬编码的,而是从API中动态提取的(这与此无关)。
因此,上面列出的是有效的slug,但这不是:
blue-modern
kitchen-blue
kitchen-modern-blue这就是为什么我提到有效的顺序是style -> color -> type (但不是所有的值都是强制的,它可以只有一个或两个,最多三个,但总是按这个顺序)
提前感谢!
发布于 2020-05-05 01:08:10
我将创建一个有效组合数组,如下所示:
const stylesArray = ['modern'];
const colorsArray = ['blue', 'white'];
const typesArray = ['kitchen', 'living room', 'bedroom'];
stylesArray.push(null);
colorsArray.push(null);
typesArray.push(null);
var combinations = [];
stylesArray.forEach(style => {
colorsArray.forEach(color => {
combinations.push([style, color]);
typesArray.forEach(type => {
combinations.push([style, color, type]);
});
});
});
var validSlugs = combinations.map(comb => comb.filter(el => el).join('-'));
console.log(validSlugs);
我基本上创建了一个组合数组,其中每个元素都是三个值(包括可能的null)的数组,然后将其映射到字符串。
发布于 2020-05-05 01:29:22
您可以先创建a tree,然后在BFS中创建traverse
const stylesArray = ["modern"];
const colorsArray = ["blue", "white"];
const typesArray = ["kitchen", "living room", "bedroom"];
const items = [
{
id: stylesArray[0],
children: colorsArray.map((id) => ({
id,
children: typesArray,
})),
},
];
const traverse = (items, prefix = "", slugs = new Set()) => {
if (Array.isArray(items)) {
items.forEach((x) => traverse(x, prefix, slugs));
} else if (typeof items === "object") {
prefix && slugs.add(items.id);
slugs.add(prefix + items.id);
items.children.forEach((ch) => {
traverse(ch, prefix + items.id + "-", slugs);
});
} else {
items = items.replace(/\s+/, "-");
prefix && slugs.add(items); //comment if u need induvidule kitchen, living room
slugs.add(prefix + items);
}
return Array.from(slugs);
};
console.log(traverse(items).sort((x, y) => x.length - y.length));
https://stackoverflow.com/questions/61597271
复制相似问题