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 相关文章推荐
javascript tips提示框组件实现代码
Nov 19 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
javascript作用域问题实例分析
Jul 13 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
Oct 28 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
Dec 14 Javascript
微信小程序 scroll-view实现锚点滑动的示例
Dec 06 Javascript
axios post提交formdata的实例
Mar 16 Javascript
vue源码学习之Object.defineProperty 对数组监听
May 30 Javascript
小程序中canvas的drawImage方法参数使用详解
Jul 04 Javascript
node.js实现上传文件功能
Jul 15 Javascript
vue.config.js中配置Vue的路径别名的方法
Feb 11 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 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
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
php 301转向实现代码
2008/09/18 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
python重试装饰器的简单实现方法
2019/01/31 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
用python实现学生管理系统
2020/07/24 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
Django多数据库联用实现方法解析
2020/11/12 Python
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
怎么样写好简历中的自我评价
2013/10/25 职场文书
行政管理专业推荐信
2013/11/02 职场文书
中专毕业生的自我鉴定
2013/12/01 职场文书
房地产营销策划方案
2014/02/08 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
服务之星事迹材料
2014/05/03 职场文书
党小组考察意见
2015/06/02 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android