如何生成笛卡尔积?

现在有这几个数据

let names = ["iPhone X", "iPhone XS"]

let colors = ["黑色", "白色"]

let storages = ["64g", "256g"]

要转换成

[
    {
        "spec": [
            {
                "name": "iPhone X"
            },
            {
                "name": "黑色"
            },
            {
                "name": "64g"
            }
        ]
    },
    {
        "spec": [
            {
                "name": "iPhone X"
            },
            {
                "name": "黑色"
            },
            {
                "name": "256g"
            }
        ]
    },
    {
        "spec": [
            {
                "name": "iPhone X"
            },
            {
                "name": "白色"
            },
            {
                "name": "64g"
            }
        ]
    },
    {
        "spec": [
            {
                "name": "iPhone X"
            },
            {
                "name": "白色"
            },
            {
                "name": "256g"
            }
        ]
    },
    {
        "spec": [
            {
                "name": "iPhone XS"
            },
            {
                "name": "黑色"
            },
            {
                "name": "64g"
            }
        ]
    },
    {
        "spec": [
            {
                "name": "iPhone XS"
            },
            {
                "name": "黑色"
            },
            {
                "name": "256g"
            }
        ]
    },
    {
        "spec": [
            {
                "name": "iPhone XS"
            },
            {
                "name": "白色"
            },
            {
                "name": "64g"
            }
        ]
    },
    {
        "spec": [
            {
                "name": "iPhone XS"
            },
            {
                "name": "白色"
            },
            {
                "name": "256g"
            }
        ]
    }
]
阅读 1k
avatarAI BotBETA

要生成笛卡尔积,你可以使用嵌套循环来遍历每个数组的元素,并构建所需的输出数组。下面是一个使用 JavaScript 实现的示例代码:

let names = ["iPhone X", "iPhone XS"];
let colors = ["黑色", "白色"];
let storages = ["64g", "256g"];

let result = [];

// 遍历names数组
for (let i = 0; i < names.length; i++) {
  // 遍历colors数组
  for (let j = 0; j < colors.length; j++) {
    // 遍历storages数组
    for (let k = 0; k < storages.length; k++) {
      // 构建笛卡尔积的每一项
      let spec = [
        { name: names[i] },
        { name: colors[j] },
        { name: storages[k] }
      ];

      // 将spec添加到结果数组中
      result.push({ spec: spec });
    }
  }
}

console.log(result);

运行上述代码后,result 变量将包含你期望的输出数组。

在这个示例中,我们使用三个嵌套的 for 循环来遍历 namescolorsstorages 数组。在每个循环中,我们构建了一个 spec 数组,其中包含了当前迭代的元素,并将 spec 添加到结果数组中。最终,结果数组将包含所有可能的笛卡尔积组合。

2 个回答

let names = ["iPhone X", "iPhone XS"]

let colors = ["黑色", "白色"]

let storages = ["64g", "256g"]

let combine = function (...chunks) {
  let res = []

  let helper = function (chunkIndex, prev) {
    let chunk = chunks[chunkIndex]
    let isLast = chunkIndex === chunks.length - 1
    for (let val of chunk) {
      let cur = prev.concat({name: val})
      if (isLast) {
        // 如果已经处理到数组的最后一项了 则把拼接的结果放入返回值中
        res.push({spec: cur})
      } else {
        helper(chunkIndex + 1, cur)
      }
    }
  }

  // 从属性数组下标为 0 开始处理
  // 并且此时的 prev 是个空数组
  helper(0, [])

  return res
}

console.log(combine(names, colors, storages))
let names = ["iPhone X", "iPhone XS"];
let colors = ["黑色", "白色"];
let storages = ["64g", "256g"];

const r1 = names.map(name => ({ name }));
const r2 = r1.flatMap(it => colors.map(name => [{ ...it }, { name }]));
const r3 = r2.flatMap(it => storages.map(name => [...it, { name }]));
const r = r3.map(spec => ({ spec }));
console.dir(r, { depth: null });

snipaste_2024-04-08_18-04-58.png


补充了一个函数

function multiply(...arrayList) {
    return arrayList
        .reduce(
            (r, arr) => r.flatMap(it => arr.map(name => [...it, { name }])),
            [[]]
        )
        .map(spec => ({ spec }));
}

console.dir(multiply(names, colors, storages), { depth: null });

snipaste_2024-04-08_18-44-18.png

推荐问题