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 相关文章推荐
js的event详解。
Sep 06 Javascript
JavaScript 解析读取XML文档 实例代码
Jul 07 Javascript
Javascript和Ajax中文乱码吐血版解决方案
Dec 21 Javascript
使用JQUERY Tabs插件宿主IFRAMES
Jan 01 Javascript
jQuery对象与DOM对象之间的转换方法
Apr 15 Javascript
JQuery 图片的展开和伸缩实例讲解
Apr 18 Javascript
Javascript Web Slider 焦点图示例源码
Oct 10 Javascript
ExtJS4如何给同一个formpanel不同的url
May 02 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
Aug 11 Javascript
Vue项目中跨域问题解决方案
Jun 05 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
浅入深出Vue之组件使用
Jul 11 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
php5.2时间相差8小时
2007/01/15 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
用JS生成UUID的方法实例
2016/03/30 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
python基于pyDes库实现des加密的方法
2017/04/29 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
python中图像通道分离与合并实例
2020/01/17 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
建设投标担保书
2014/05/13 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
毕业设计致谢词
2015/05/14 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书