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 相关文章推荐
jQuery ajax 路由和过滤器使用说明
Aug 02 Javascript
拉动滚动条加载数据的jquery代码
May 03 Javascript
JS过滤url参数特殊字符的实现方法
Dec 24 Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 Javascript
利用jquery禁止外层滚动条的滚动
Jan 05 Javascript
js实现将json数组显示前台table中
Jan 10 Javascript
原生js实现简单的Ripple按钮实例代码
Mar 24 Javascript
Vue.js实现文章评论和回复评论功能
May 30 Javascript
Jquery把获取到的input值转换成json
May 15 jQuery
ES7中利用Await减少回调嵌套的方法详解
Nov 01 Javascript
javascript canvas API内容整理
Feb 16 Javascript
vue 获取元素额外生成的data-v-xxx操作
Sep 09 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
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
PHP与Web页面的交互示例详解二
2020/08/04 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
JS中的数组方法笔记整理
2016/07/26 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
python处理中文编码和判断编码示例
2014/02/26 Python
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
简单了解python的内存管理机制
2019/07/08 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
优秀电子工程系毕业生求职信
2014/05/24 职场文书
计算机专业求职信
2014/06/02 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js