有以下数据:
const labels = [
["红色", "黄色", "蓝色"],
["8g", "12g", "16g", "24g"],
["小米10", "小米11", "小米12", "小米13"],
["pro", "plus"],
// 后续N个参数列表
...
];
要求是,将所有项按顺序一一组合,如 红色8g小米10pro,红色8g小米10plus,红色8g小米11pro,红色8g小米11plus,...
以下是我的暴力解法
const combination = labels.reduce((result, item) => {
if (!result.length) {
result = [...item];
} else {
result = connect(result, item);
}
return result;
}, []);
function connect(s1, s2) {
const c = [];
s1.forEach(_s1 => {
s2.forEach(_s2 => {
c.push(_s1 + _s2);
});
});
return c;
};
再者,不按顺序又该如何解
const labels = [
["红色", "黄色", "蓝色"],
["8g", "12g", "16g", "24g"],
["小米10", "小米11", "小米12", "小米13"],
["pro", "plus"],
// 后续N个参数列表
// ...
];
function comb(arr1, arr2) {
var res = []
for(var it1 of arr1){
for(var it2 of arr2){
res.push(it1 + it2)
}
}
return res
}
var res = [""]
for (var l of labels) {
res = comb(res, l)
}
console.log(res)
// ['红色8g小米10pro', '红色8g小米10plus', '红色8g小米11pro', '红色8g小米11plus', '红色8g小米12pro', '红色8g小米12plus', '红色8g小米13pro', '红色8g小米13plus', '红色12g小米10pro', '红色12g小米10plus', '红色12g小米11pro', '红色12g小米11plus', '红色12g小米12pro', '红色12g小米12plus', '红色12g小米13pro', '红色12g小米13plus', '红色16g小米10pro', '红色16g小米10plus', '红色16g小米11pro', '红色16g小米11plus', '红色16g小米12pro', '红色16g小米12plus', '红色16g小米13pro', '红色16g小米13plus', '红色24g小米10pro', '红色24g小米10plus', '红色24g小米11pro', '红色24g小米11plus', '红色24g小米12pro', '红色24g小米12plus', '红色24g小米13pro', '红色24g小米13plus', '黄色8g小米10pro', '黄色8g小米10plus', '黄色8g小米11pro', '黄色8g小米11plus', '黄色8g小米12pro', '黄色8g小米12plus', '黄色8g小米13pro', '黄色8g小米13plus', '黄色12g小米10pro', '黄色12g小米10plus', '黄色12g小米11pro', '黄色12g小米11plus', '黄色12g小米12pro', '黄色12g小米12plus', '黄色12g小米13pro', '黄色12g小米13plus', '黄色16g小米10pro', '黄色16g小米10plus', '黄色16g小米11pro', '黄色16g小米11plus', '黄色16g小米12pro', '黄色16g小米12plus', '黄色16g小米13pro', '黄色16g小米13plus', '黄色24g小米10pro', '黄色24g小米10plus', '黄色24g小米11pro', '黄色24g小米11plus', '黄色24g小米12pro', '黄色24g小米12plus', '黄色24g小米13pro', '黄色24g小米13plus', '蓝色8g小米10pro', '蓝色8g小米10plus', '蓝色8g小米11pro', '蓝色8g小米11plus', '蓝色8g小米12pro', '蓝色8g小米12plus', '蓝色8g小米13pro', '蓝色8g小米13plus', '蓝色12g小米10pro', '蓝色12g小米10plus', '蓝色12g小米11pro', '蓝色12g小米11plus', '蓝色12g小米12pro', '蓝色12g小米12plus', '蓝色12g小米13pro', '蓝色12g小米13plus', '蓝色16g小米10pro', '蓝色16g小米10plus', '蓝色16g小米11pro', '蓝色16g小米11plus', '蓝色16g小米12pro', '蓝色16g小米12plus', '蓝色16g小米13pro', '蓝色16g小米13plus', '蓝色24g小米10pro', '蓝色24g小米10plus', '蓝色24g小米11pro', '蓝色24g小米11plus', '蓝色24g小米12pro', '蓝色24g小米12plus', '蓝色24g小米13pro', '蓝色24g小米13plus']
你解法已经很好了,对于不按顺序组合的问题,你可以用递归的方法来实现:
function cartesianProduct(labels, index = 0, current = '') {
if (index === labels.length) {
return [current];
}
let result = [];
for (const item of labels[index]) {
result = result.concat(cartesianProduct(labels, index + 1, current + item));
}
return result;
}
const labels = [
["红色", "黄色", "蓝色"],
["8g", "12g", "16g", "24g"],
["小米10", "小米11", "小米12", "小米13"],
["pro", "plus"],
// 后续N个参数列表
...
];
const combinations = cartesianProduct(labels);
console.log(combinations);
请教一个算法问题 输入原数组(按start排序, 并且下一项的start一定>=前一项的end) 提取出连续的相同项合并成一个新的对象, 插入原数组, 根据start和end判断是否连续 如例子里的(0,1,2)项里的B 提取并合并得到{ "start": 1, "end": 4, "content": ["B"] } (2,3)项里的D 提取并合并得到{ "start": 3, "end": 5
一位老师教一个班级的学生们四门课程,分别是数学、音乐、英语和自然课,对于在上这些课程的学生们满足以下条件每节课程只有3个学生。 这个班任意每两个学生至少一起上一门课程。 编写一段java程序, 计算该班最多可以有多少学生并生成所有符合上诉条件的分组可能。
问题背景:我现在想做一个关于文本溢出,显示展开按钮,文本如果没溢出,就不显示展开按钮 例子:如果文本超出两行,显示按钮,小于等于两行,那么就不显示按钮。 但是不知道如何判断文本是否会超出两行?
需求是要截取小程序里的一个页面长图分享到分享到朋友圈,有什么方案可以实现吗
本文向大家介绍请问你知道什么加密算法吗相关面试题,主要包含被问及请问你知道什么加密算法吗时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 常见的加密算法分为三类,对称加密算法,非对称加密算法,Hash算法 对称加密,指加密和解密使用相同密钥的加密算法,常见的有DES、3DES、DEXS,RC4、RC5,AES 非对称加密,常见的有RSA、DSA Hash算法:它是一种单向算法,用户可以通过h
本文向大家介绍请简述一下GC算法相关面试题,主要包含被问及请简述一下GC算法时的应答技巧和注意事项,需要的朋友参考一下 考察点:JVM ①GC(GarbageCollection 垃圾收集),GC的对象是堆空间和永久区 ②GC算法包含:引用计数法,标记清除,标记压缩,复制算法。 ③引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就