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事件模型代码
Jul 01 Javascript
js跨域和ajax 跨域问题的实现思路
Sep 05 Javascript
客户端 使用XML DOM加载json数据的方法
Sep 28 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
Jul 12 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
Apr 08 Javascript
AngularJS入门心得之directive和controller通信过程
Jan 25 Javascript
vue2.0获取自定义属性的值
Mar 28 Javascript
基于vue 开发中出现警告问题去除方法
Jan 25 Javascript
详解Vue打包优化之code spliting
Apr 09 Javascript
JavaScript常见鼠标事件与用法分析
Jan 03 Javascript
vue 组件开发原理与实现方法详解
Nov 29 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
Aug 10 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
Session的工作方式
2006/10/09 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
编辑浪子版表单验证类
2007/05/12 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
详解vue.js的devtools安装
2017/05/26 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
2018/07/06 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
前台接待的工作职责
2013/11/21 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
教师求职自荐信
2015/03/26 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
合理化建议书范文
2015/09/14 职场文书