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插件集合推荐
Apr 19 Javascript
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
Apr 10 Javascript
node.js中的fs.exists方法使用说明
Dec 17 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
Apr 07 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 Javascript
js提交form表单,并传递参数的实现方法
May 25 Javascript
opencv 识别微信登录验证滑动块位置
Aug 07 Javascript
浅谈发布订阅模式与观察者模式
Apr 09 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
May 05 Javascript
使用JavaScript计算前一天和后一天的思路详解
Dec 20 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 Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php操作JSON格式数据的实现代码
2011/12/24 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
PHP跨平台获取服务器IP地址自定义函数分享
2014/12/29 PHP
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
javascript数组的使用
2013/03/28 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
js初始化验证实例详解
2016/11/26 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
Python第三方库的安装方法总结
2016/06/06 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
Python timeit模块的使用实践
2020/01/13 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
NOTINO英国:在线购买美容和香水
2020/02/25 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
体育教育毕业生自荐信
2013/11/21 职场文书
《童趣》教学反思
2014/02/19 职场文书
计算机网络专业自荐信
2014/07/04 职场文书
个人授权委托书范本
2014/09/14 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python