如何在NodeJS中编写generatePermutations函数生成对象属性数组的全排列?
实现Node.js中的对象属性排列生成函数
嘿,我来帮你搞定这个generatePermutations()函数!核心思路就是先把输入对象的属性统一处理成非空数组,然后计算这些数组的笛卡尔积,最后把每个组合映射成对应的对象就行。咱们一步步来拆解:
第一步:预处理输入对象
首先得把输入的对象整理成符合要求的格式:
- 如果某个属性的值是空数组,直接忽略它;
- 如果值不是数组,就把它转换成只包含这个值的数组(比如你的例子里
ship: "Falcon"要变成ship: ["Falcon"]); - 非空的数组属性就直接保留。
第二步:生成笛卡尔积
笛卡尔积就是从每个数组里选一个元素,所有可能的组合。比如你示例里的pilot有2个选项,copilot有2个,ship和speed各1个,总共有2*2*1*1=4种组合,正好对应你要的输出结果。
完整代码实现
结合上面的思路,咱们写出完整的函数:
function generatePermutations(inputObj) { // 预处理输入:过滤空数组,统一转成非空数组格式 const processedProps = Object.entries(inputObj).reduce((acc, [key, value]) => { // 空数组直接跳过 if (Array.isArray(value) && value.length === 0) { return acc; } // 非数组转单元素数组,数组则直接保留 acc[key] = Array.isArray(value) ? value : [value]; return acc; }, {}); // 提取处理后的属性名和对应的数组列表 const propKeys = Object.keys(processedProps); const propArrays = Object.values(processedProps); // 计算笛卡尔积:把多个数组的所有组合列出来 const cartesianProduct = propArrays.reduce((combinations, currentArray) => { return combinations.flatMap(prevComb => { return currentArray.map(item => [...prevComb, item]); }); }, [[]]); // 初始值是包含空数组的数组,用来启动组合 // 把每个组合数组转换成对应的对象 return cartesianProduct.map(combination => { return combination.reduce((resultObj, val, index) => { resultObj[propKeys[index]] = val; return resultObj; }, {}); }); } // 测试示例输入 const testInput = { pilot: ["Han Solo", "Lando Calrissian"], copilot: ["Chewbacca", "Rey"], ship: "Falcon", speed: "1.5c" }; console.log(generatePermutations(testInput));
代码关键点解释
- 预处理阶段:用
Object.entries()遍历输入对象的键值对,通过reduce筛选出符合要求的属性,统一成数组格式; - 笛卡尔积计算:用
reduce迭代每个数组,通过flatMap和map把之前的组合和当前数组的元素逐一配对,生成所有可能的组合; - 组合转对象:把每个组合数组的元素,按照对应的属性名映射成最终的对象。
额外情况说明
- 如果输入对象是空的,函数会返回
[{}](一个包含空对象的数组); - 如果所有属性都是空数组,函数会返回
[](空数组); - 单个属性的情况也能正常处理,比如输入
{a: [1,2]}会返回[{a:1}, {a:2}]。
内容的提问来源于stack exchange,提问作者Sterling Perry
相关产品推荐
相关产品推荐

