如何将两个整数数组双向笛卡尔积转换为嵌套对象?
实现双向笛卡尔积到嵌套对象的转换
嘿,我懂你想要做的事儿——把两个整数数组的双向笛卡尔积转换成嵌套对象结构,对吧?其实这不算严格意义上的排列问题,就是基于笛卡尔积的双向映射构建,用数组的原生方法完全能搞定,forEach和reduce组合起来就很顺手。
思路拆解
- 最终的结果对象需要包含两个方向的映射:一个是数组
a的元素对应数组b的所有元素(也就是你示例里的firstWay),另一个是数组b的元素对应数组a的所有元素(咱们叫它secondWay) - 对于每个方向的映射,咱们可以用
forEach遍历外层数组的每个元素,再用reduce来构建内层的键值对对象,把对应数组的元素都设为键,值统一用true
完整实现代码
const a = [1, 2, 3]; const b = [4, 5, 6]; function doCartesian(a, b) { // 初始化结果容器,包含两个方向的映射入口 const result = { firstWay: {}, secondWay: {} }; // 构建a -> b的映射:a的每个元素对应b的所有元素 a.forEach(numA => { result.firstWay[numA] = b.reduce((innerObj, numB) => { innerObj[numB] = true; return innerObj; }, {}); }); // 构建b -> a的映射:b的每个元素对应a的所有元素 b.forEach(numB => { result.secondWay[numB] = a.reduce((innerObj, numA) => { innerObj[numA] = true; return innerObj; }, {}); }); return result; } // 输出结果 console.log(doCartesian(a, b));
代码说明
forEach负责遍历外层数组的每一个元素,为每个元素创建对应的嵌套对象入口reduce的作用是把内层数组的元素逐个添加到空对象中,最终形成{ 4: true, 5: true, 6: true }这样的结构- 如果你只需要单向的映射(比如只保留
firstWay),直接删掉secondWay相关的代码块就行
内容的提问来源于stack exchange,提问作者jkossis
相关产品推荐
相关产品推荐

