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中执行任意html代码的方法示例解读
Dec 25 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
Aug 24 Javascript
使用mini-define实现前端代码的模块化管理
Dec 25 Javascript
javascript数组输出的两种方式
Jan 13 Javascript
jquery移动节点实例
Jan 14 Javascript
如何提高Dom访问速度
Jan 05 Javascript
Javascript中字符串相关常用的使用方法总结
Mar 13 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
May 02 Javascript
详解Koa中更方便简单发送响应的方式
Jul 20 Javascript
vue实现分页组件
Jun 16 Javascript
webpack5 联邦模块介绍详解
Jul 08 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
Oct 27 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、Python和Javascript的装饰器模式对比
2015/02/03 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
vue的mixins属性详解
2018/03/14 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
python mysqldb连接数据库
2009/03/16 Python
Python深入学习之特殊方法与多范式
2014/08/31 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
Python 多进程、多线程效率对比
2020/11/19 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
办公室主任岗位职责
2013/11/08 职场文书
建筑投标担保书
2014/05/20 职场文书
人事专员岗位说明书
2014/07/29 职场文书
论文致谢词范文
2015/05/14 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL