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 相关文章推荐
select标记美化--JS式插件、后期加载
Apr 01 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 Javascript
javascript 面向对象封装与继承
Nov 27 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
Mar 04 Javascript
SuperSlide标签切换、焦点图多种组合插件
Mar 14 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
BootStrap glyphicon图标无法显示的解决方法
Sep 06 Javascript
js单页hash路由原理与应用实战详解
Aug 14 Javascript
详解webpack3如何正确引用并使用jQuery库
Aug 26 jQuery
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
Sep 28 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
VOLVO车载收音机
2021/03/02 无线电
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
Laravel find in set排序实例
2019/10/09 PHP
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
python3抓取中文网页的方法
2015/07/28 Python
python使用生成器实现可迭代对象
2018/03/20 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
Python os.access()用法实例
2019/02/18 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
python实现人机猜拳小游戏
2020/02/03 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
python 基于opencv操作摄像头
2020/12/24 Python
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
校优秀毕业生主要事迹
2014/05/26 职场文书
低碳环保口号
2014/06/12 职场文书
园林技术专业求职信
2014/07/28 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
2016年过年放假安排通知
2015/08/18 职场文书