JavaScript 计算笛卡尔积实例详解

 更新时间:2016年12月02日 15:42:49   作者:zhangchao19890805  
这篇文章主要介绍了JavaScript 计算笛卡尔积实例详解的相关资料,这里附有实例代码,需要的朋友可以参考下

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中location.reload刷新页面用法详解

    前端JavaScript中location.reload刷新页面用法详解

    这篇文章主要介绍了前端JavaScript中location.reload刷新页面用法的相关资料,location.reload()是JavaScript中用于重新加载当前页面的方法,它可以接受一个布尔参数,以决定是否忽略缓存,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • 老生常谈jacascript DOM节点获取

    老生常谈jacascript DOM节点获取

    下面小编就为大家带来一篇老生常谈jacascript DOM节点获取。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • JS实现pasteHTML兼容ie,firefox,chrome的方法

    JS实现pasteHTML兼容ie,firefox,chrome的方法

    这篇文章主要介绍了JS实现pasteHTML兼容ie,firefox,chrome的方法,涉及javascript针对页面元素的动态操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • layui-table获得当前行的上/下一行数据的例子

    layui-table获得当前行的上/下一行数据的例子

    今天小编就为大家分享一篇layui-table获得当前行的上/下一行数据的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • element-ui的回调函数Events的用法详解

    element-ui的回调函数Events的用法详解

    这篇文章主要介绍了element-ui的回调函数Events的用法,本文通过实例代码给大家介绍了change回调函数的使用方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • javascript字符串对象常用api函数小结(连接,替换,分割,转换等)

    javascript字符串对象常用api函数小结(连接,替换,分割,转换等)

    这篇文章主要介绍了javascript字符串对象常用api函数,结合实例形式总结分析了javascript常用的连接、替换、分割、转换等相关函数与使用方法,需要的朋友可以参考下
    2016-09-09
  • async/await实现Promise.all()的方式

    async/await实现Promise.all()的方式

    Promise.all() 方法接收一个 promise 的 iterable 类型的输入,并且只返回一个Promise实例,并且输入的所有 promise 的 resolve 回调的结果是一个数组,对async/await实现Promise.all()相关知识感兴趣的朋友一起看看吧
    2022-12-12
  • javascript创建页面蒙板的一些知识技巧总结

    javascript创建页面蒙板的一些知识技巧总结

    javascript创建页面蒙板的一些知识技巧总结...
    2007-08-08
  • 原生js实现点击按钮复制内容到剪切板

    原生js实现点击按钮复制内容到剪切板

    这篇文章主要为大家详细介绍了原生js实现点击按钮复制内容到剪切板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • JavaScript函数的一些注意要点小结及js匿名函数

    JavaScript函数的一些注意要点小结及js匿名函数

    本文给大家总结了javascript函数的一些注意要点及js匿名函数,主要知识点有:函数的基本语法、函数的参数、函数的重载相关知识,对本文感兴趣的朋友一起学习吧
    2015-11-11

最新评论