JavaScript 计算笛卡尔积实例详解


Posted in Javascript onDecember 02, 2016

JavaScript实现笛卡尔积

注意:本文中所说的集合是指数学上的集合,不是es6里的Set。

整体思路如下:

  1. 用户传入一个二维的数组,每个子数组都是一个要进行笛卡尔积计算的集合。返回一个二维数组,每个子数组都是一个有序对或者n元有序组。
  2. 当用户传入一个集合的时候,为了兼容业务,返回形如:[[a],[b]…]的二维数组。
  3. 当用户只传入两个集合计算的时候,普通的嵌套计算即可。
  4. 当用户传入3个或者3个以上的集合的时候,先计算最后两个集合的结果,再依次把前面的集合与其进行计算。

实现代码如下:

descates.js

/**
 * Created by Hawk on 2016/6/18.
 */
var DescartesUtils = {

  /**
   * 如果传入的参数只有一个数组,求笛卡尔积结果
   * @param arr1 一维数组
   * @returns {Array}
   */
  descartes1:function(arr1){
    // 返回结果,是一个二维数组
    var result = [];
    var i = 0;
    for (i = 0; i < arr1.length; i++) {
      var item1 = arr1[i];
      result.push([item1]);
    }
    return result;
  },

  /**
   * 如果传入的参数只有两个数组,求笛卡尔积结果
   * @param arr1 一维数组
   * @param arr2 一维数组
   * @returns {Array}
   */
  descartes2: function(arr1, arr2) {
    // 返回结果,是一个二维数组
    var result = [];
    var i = 0, j = 0;
    for (i = 0; i < arr1.length; i++) {
      var item1 = arr1[i];
      for (j = 0; j < arr2.length; j++) {
        var item2 = arr2[j];
        result.push([item1, item2]);
      }
    }
    return result;
  },

  /**
   *
   * @param arr2D 二维数组
   * @param arr1D 一维数组
   * @returns {Array}
   */
  descartes2DAnd1D: function(arr2D, arr1D) {
    var i = 0, j = 0;
    // 返回结果,是一个二维数组
    var result = [];

    for (i = 0; i < arr2D.length; i++) {
      var arrOf2D = arr2D[i];
      for (j = 0; j < arr1D.length; j++) {
        var item1D = arr1D[j];
        result.push(arrOf2D.concat(item1D));
      }
    }

    return result;
  },

  descartes3: function(list) {
    var listLength = list.length;
    var i = 0, j = 0;
    // 返回结果,是一个二维数组
    var result = [];
    // 为了便于观察,采用这种顺序
    var arr2D = DescartesUtils.descartes2(list[0], list[1]);
    for (i = 2; i < listLength; i++) {
      var arrOfList = list[i];
      arr2D = DescartesUtils.descartes2DAnd1D(arr2D, arrOfList);
    }
    return arr2D;
  },

  //笛卡儿积组合
  descartes: function(list)
  {
    if (!list) {
      return [];
    }
    if (list.length <= 0) {
      return [];
    }
    if (list.length == 1) {
      return DescartesUtils.descartes1(list[0]);
    }
    if (list.length == 2) {
      return DescartesUtils.descartes2(list[0], list[1]);
    }
    if (list.length >= 3) {
      return DescartesUtils.descartes3(list);
    }
  }

};

descartes.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title></title>
  <script type="text/javascript" src="descartes.js"></script>
</head>
<body>


<div id="resultDiv"></div>
<script type="text/javascript">
  var arr1 = [1,2,3];
  var arr2 = ["a", "b", "c", "d"];
  var list = [arr1, arr2];
  var list2 = [
    [1,2,3],
    ["a", "b", "c"],
    ["A", "B"],
    ["啊","把","车","的"]
  ];
  var result = DescartesUtils.descartes(list2);

  var html = "";
  for (var i = 0; i < result.length; i++) {
    html = html + result[i].join(",") + "<br>";
  }
  document.getElementById("resultDiv").innerHTML = html;
</script>
</body>
</html>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
表单提交验证类
Jul 14 Javascript
根据分辨率不同,调用不同的css文件
Aug 25 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
Nov 01 Javascript
JQuery下拉框应用示例介绍
Apr 23 Javascript
node.js中的fs.readdirSync方法使用说明
Dec 17 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
Sep 21 Javascript
AngularJs页面筛选标签小功能
Aug 01 Javascript
解决vue-router中的query动态传参问题
Mar 20 Javascript
jQuery实现使用sort方法对json数据排序的方法
Apr 17 jQuery
js array数组对象操作方法汇总
Mar 18 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 Javascript
微信小程序文章详情功能完整实例
Jun 03 Javascript
jQuery联动日历的实例解析
Dec 02 #Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
Dec 02 #Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 #Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
Dec 02 #Javascript
Vue.js路由组件vue-router使用方法详解
Dec 02 #Javascript
搭建Bootstrap离线文档的方法
Dec 02 #Javascript
巧用Javascript的逻辑运算符
Dec 02 #Javascript
You might like
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
Python文件和流(实例讲解)
2017/09/12 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
文明礼仪小标兵事迹
2014/01/12 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
医德医风个人总结
2015/02/28 职场文书
医学生自荐信范文
2015/03/05 职场文书
灵魂歌王观后感
2015/06/17 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
Java 多线程协作作业之信号同步
2022/05/11 Java/Android