javascript - 使用 reduce、map 和 spread 的笛卡尔积对需要展平的结果进行分组

标签 javascript arrays ecmascript-6

class MathSet extends Set{
  constructor(arr){
     super(arr);
     }
  union(set){
     return new MathSet([...this, ...set])
  }
  intersection(set){
     return new MathSet([...this].filter(x => set.has(x)));
  }
  difference(set){
     return new MathSet([...this].filter(x => !set.has(x)));
  }
  cartesian(set){
     return new MathSet( [...this].reduce((acc, i)=> [...acc, [...set].map(j=>[i,j])], []) )
  }
}

let x = new MathSet([1,2,3]);
let y = new MathSet([1,2,3,4,5]);

console.log(JSON.stringify([...x.cartesian(y)]));
//[
//  [[1,1],[1,2],[1,3],[1,4],[1,5]],
//  [[2,1],[2,2],[2,3],[2,4],[2,5]],
//  [[3,1],[3,2],[3,3],[3,4],[3,5]]
// ]

使用 cartesian 函数的预期结果是上述数组的扁平化版本 ([[1,1],[1,2],[1,3],[1,4 ],[1,5],[2,1],[2,2],[2,3],[2,4],[2,5],[3,1],[3,2], [3,3],[3,4],[3,5]]), 但正如您所见,它以某种方式被分为三个数组。 reduce 继续将早期结果与新结果的扩展版本连接起来。猜猜我做错了什么?

最佳答案

要展平阵列,您只需要再展开一次:

return new MathSet( [...this].reduce((acc, i)=> [...acc, ...[...set].map(j=>[i,j])], []) )
//                                                       ^^^

(或acc.concat(Array.from(set,j=>[i,j])))

关于javascript - 使用 reduce、map 和 spread 的笛卡尔积对需要展平的结果进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39820238/

相关文章:

javascript - 按标签过滤对象(对象数组中的数组)

javascript - 单击链接添加新的下拉菜单框

Java将错误的数据写入数组

javascript - 在 typescript 的同一行导入和调用函数

node.js - NodeJS在声明Sequelize 6多对多关联模型时相互导入文件

javascript - 正确使用setTimeout

python - 在2D Matrix python中选择元素并分配字符

arrays - 协议(protocol)类型数组不能向下转换为具体类型数组

javascript - 如何删除 React Native 中的警告

javascript - 将链接插入 react 工具提示