You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:22:49