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 相关文章推荐
js调用后台servlet方法实例
Jun 09 Javascript
JavaScript中的值类型详细介绍
Dec 29 Javascript
AngularJS模块管理问题的非常规处理方法
Apr 29 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
Jan 27 Javascript
AngularJS directive返回对象属性详解
Mar 28 Javascript
js字符串操作总结(必看篇)
Nov 22 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
Feb 21 Javascript
Webpack实战加载SVG的方法
Dec 26 Javascript
vue 实现通过手机发送短信验证码注册功能
Apr 19 Javascript
node中的session的具体使用
Sep 14 Javascript
使用TS来编写express服务器的方法步骤
Oct 29 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
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
JavaScript function函数种类详解
2016/02/22 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
vuex存储token示例
2019/11/11 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
js实现星星打分效果
2020/07/05 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
python原始套接字编程示例分享
2014/02/21 Python
Python使用gensim计算文档相似性
2016/04/10 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
会计学应届毕业生推荐信
2013/11/04 职场文书
大学生毕业的自我鉴定
2013/11/13 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
公务员个人年终总结
2015/02/12 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
入党自传范文2015
2015/06/26 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
导游词之凤凰古城
2019/10/22 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android