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的一些小应用收集
Mar 27 Javascript
转换json格式的日期为Javascript对象的函数
Jul 13 Javascript
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
Mar 28 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
May 05 Javascript
Jquery焦点图实例代码
Nov 25 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
Feb 24 Javascript
如何利用模板将HTML从JavaScript中抽离
Oct 08 Javascript
jquery对table做排序操作的实例演示
Aug 10 jQuery
小程序中设置缓存过期的实现方法
Jan 14 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 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两种快速排序算法实例
2015/02/15 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
js charAt的使用示例
2014/02/18 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
Node.js实现数据推送
2016/04/14 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
javascript实现商品图片放大镜
2019/11/28 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
python实现的简单猜数字游戏
2015/04/04 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
商务英语专业自荐信
2013/10/14 职场文书
大一军训感言
2014/01/09 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
Python进程池与进程锁之语法学习
2022/04/11 Python