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 相关文章推荐
什么是json和jsonp,jQuery json实例详详细说明
Dec 11 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
Apr 21 Javascript
javascript ajax 仿百度分页函数
Oct 29 Javascript
5分钟理解JavaScript中this用法分享
Nov 09 Javascript
jQuery使用$.each遍历json数组的简单实现方法
Apr 18 Javascript
jQuery 3 中的新增功能汇总介绍
Jun 12 Javascript
js判断数组key是否存在(不用循环)的简单实例
Aug 03 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
Aug 29 Javascript
vue 中引用gojs绘制E-R图的方法示例
Aug 24 Javascript
小程序getLocation需要在app.json中声明permission字段
Apr 04 Javascript
浅析Vue 防抖与节流的使用
Nov 14 Javascript
javascript实现留言板功能
Feb 08 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
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
PHP中比较时间大小实例
2014/08/21 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
vue中多个倒计时实现代码实例
2019/03/27 Javascript
vue实现评论列表功能
2019/10/25 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
Python迭代和迭代器详解
2016/11/10 Python
解决Python requests 报错方法集锦
2017/03/19 Python
Python random模块用法解析及简单示例
2017/12/18 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
Python属性和内建属性实例解析
2020/01/14 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
入党自我鉴定范文
2013/10/04 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
php中pcntl_fork详解
2021/04/01 PHP
Python数据类型最全知识总结
2021/05/31 Python
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技