使用递归-实现二维矩阵数组

2023-05-16

废话不多说,直接上代码:

 /* 函数递归  把[1,2] [3,4] [5,6] 得到 [1,3,5],[1,3,6],[1,4,5] ...
	arr : 需要递归的数组 [[1,2],[3,4],[5,6]]
	*/
    function diguiArrData(arr) {
      if (arr.length <= 1) return arr;
      let arr1 = arr[0]
      let arr2 = arr[1]
      let index = 1

      return assembleData(arr, arr1, arr2, index)

      function assembleData(arr, arr1, arr2, index) {
        if (!arr1.length) arr1 = ['']  //空数组
        if (!arr2.length) arr2 = ['']  //空数组
        let arr3 = []

        for (let i = 0; i < arr1.length; i++) {
          for (let j = 0; j < arr2.length; j++) {
            if (arr1[i].length > 1) {
              arr3.push(arr1[i].concat(arr2[j]))  //如果数组里面多于两个数据,合并两个数组
            } else {
              arr3.push([arr1[i], arr2[j]])  //
            }
          }
        }
        if (arr[index + 1]) { //传入的数据下一项,不为空,再执行一次
          return assembleData(arr, arr3, arr[index + 1], index + 1)
        } else {
          return arr3
        }
      };

    };
    let ttarr = [[1, 2], [3, 4], [5, 6], [7]]
    console.log(diguiArrData(ttarr))

这里写图片描述

实现自己的业务逻辑—效果图如下:
表格使用的ant-design的table组件
这里写图片描述
已知的数据格式:

var specData = [
      {
        specname: '尺码',
        id: 1,
        type: [
          {
            typename: '大码',
            key: 1,
          },
          {
            typename: '中码',
            key: 2,
          },
          {
            typename: '小码',
            key: 3,
          },
        ],
      },
      {
        specname: '颜色',
        id: 2,
        type: [
          {
            typename: '红色',
            key: 4,
          },
          {
            typename: '黄色',
            key: 5,
          },
          {
            typename: '绿色',
            key: 6,
          },
        ],
      },
      {
        specname: '份数',
        id: 3,
        type: [{
          typename: '中份',
          key: 7,
        },],
      },
      {
        specname: '甜度',
        id: 4,
        type: [{
          typename: '微甜',
          key: 8,
        },
        {
          typename: '不甜',
          key: 9,
        },],
      },
    ]

纵坐标:

const columns = specData.map(item => {
    const perColumns = {
      title: item.specname,
      dataIndex: `id${item.id}`,
      key: `id${item.id}`,
    }
    return perColumns
  })

这里写图片描述

横坐标数据:

	function rfdata(data) {
      if (data.type.length > 0) {
        let arr = []
        data.type.map(item => {
          let obj = {}
          obj[`id${data.id}`] = item.typename
          return arr.push(obj)
        });
        return arr
      }
    }
    function getTypeArr(specData) {
      const arr = []
      for (let i = 0, len = specData.length; i < len; i++) {
        if (rfdata(specData[i])) {
          arr.push(rfdata(specData[i]))
        }
      }
      return arr
    }
    console.log(getTypeArr(specData))
    let arr = getTypeArr(specData)

重构之后的arr数据:
这里写图片描述

最终形成所需要的数据格式:

	function refac(arr) {
      if (arr.length <= 1) return arr;
      let arr1 = arr[0]
      let arr2 = arr[1]
      let index = 1

      return assembleData(arr, arr1, arr2, index)

      function assembleData(arr, arr1, arr2, index) {
        let arr3 = []

        for (let i = 0; i < arr1.length; i++) {
          for (let j = 0; j < arr2.length; j++) {
            arr3.push(Object.assign({}, arr1[i], arr2[j]))
          }
        }
        if (arr[index + 1]) {
          return assembleData(arr, arr3, arr[index + 1], index + 1)
        } else {
          return arr3
        }
      }

    }

    console.log(refac(arr))

这里写图片描述

完成:


最后实现简单的封装:

//数据模型
const specTempData = {
      8: {
        spec_grade: "80901",
        spec_id: 8,
        spec_name: "尺码",
        spec_pid: 0,
        subclass: {
          10: { spec_id: 10, spec_name: "L", spec_grade: "80902", spec_pid: 8 },
          11: { spec_id: 11, spec_name: "M", spec_grade: "80902", spec_pid: 8 },
          12: { spec_id: 12, spec_name: "S", spec_grade: "80902", spec_pid: 8 },
        }
      },
      16: {
        spec_grade: "80901",
        spec_id: 16,
        spec_name: "绿色",
        spec_pid: 0,
        subclass: {
          17: { spec_id: 17, spec_name: "绿色", spec_grade: "80902", spec_pid: 16 },
          18: { spec_id: 18, spec_name: "黑色", spec_grade: "80902", spec_pid: 16 },
        }
      },
    }
//获取表格数据
   function getTableDataSource(data) {
      this.data = data
    }
    getTableDataSource.prototype.init = function () {
      const topCategory = this.getTypeArray(this.data)
      // console.log('topCategory', topCategory)
      const refacData = this.mergeSpec(topCategory)
      // console.log('mergeSpec', mergeSpec)
      const Final = this.getFinalData(refacData)
      // console.log('Final', Final)
      return Final
    }
    getTableDataSource.prototype.getSubclass = function (data) { //设置初级子分类
      const tempData = Object.values(data.subclass)
      data.subclass = tempData
      if (data.subclass.length > 0) {
        let rfdatarray = []
        data.subclass.map(item => {
          let obj = {}
          obj[`gs_specid${item.spec_id}`] = `${item.spec_id},`
          obj[`id${data.spec_id}`] = item.spec_name
          return rfdatarray.push(obj)
        });
        return rfdatarray
      }
    }
    getTableDataSource.prototype.getTypeArray = function (data) { //提取每一个子分类
      const tempSpec = Object.values(data)
      const arr = []
      for (let i = 0, len = tempSpec.length; i < len; i++) {
        if (this.getSubclass(tempSpec[i])) {
          arr.push(this.getSubclass(tempSpec[i]))
        }
      }
      return arr
    }
    getTableDataSource.prototype.mergeSpec = function (arr) { //所有分类合并
      if (arr.length < 1) return arr
      if (arr.length == 1) return arr[0];
      let arr1 = arr[0]
      let arr2 = arr[1]
      let index = 1
      return assembleData(arr, arr1, arr2, index)
      function assembleData(arr, arr1, arr2, index) {
        let arr3 = []
        for (let i = 0; i < arr1.length; i++) {
          for (let j = 0; j < arr2.length; j++) {
            arr3.push(Object.assign({}, arr1[i], arr2[j]))
          }
        }
        if (arr[index + 1]) {
          return assembleData(arr, arr3, arr[index + 1], index + 1)
        } else {
          return arr3
        }
      }
    }
    getTableDataSource.prototype.getFinalData = function (refacData) { //生成最终分类
      const finalData = [];
      refacData.map(item => {
        let gSpecid = '';
        Object.keys(item).map(v => {
          if (v.includes('gs_specid')) {
            const specid = v.replace('gs_specid', '')
            gSpecid += `${specid},`;
            delete item[v]
          }
        })
        const tempSpecid = { gs_specid: gSpecid.substr(0, gSpecid.length - 1) }
        finalData.push(Object.assign({}, tempSpecid, item, { gs_pic: null }, { gs_stock: null }, { gs_price: null }, { goods_id: "1" }))
      })
      return finalData
    }
//获取纵坐标数据
function getColumns(specData) {
      const tempData = Object.values(specData);
      const columns = tempData.map(item => {
        const perColumns = {
          title: item.spec_name,
          dataIndex: `id${item.spec_id}`,
          key: `id${item.spec_id}`,
        }
        return perColumns
      })
      return columns
    }

//最终结果
console.log(new getTableDataSource(specTempData).init())
console.log(getColumns(specTempData))

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用递归-实现二维矩阵数组 的相关文章

  • 放大镜插件etalage的使用方法

    效果图 如果有人需要etalage的话 xff0c 可以给我留言 xff1b 官方链接Etalage 下载位置 xff1a github 1 使用方法 安装js xff0c css xff0c 文件 xff0c 分别是 xff1a 1 xf
  • 日期插件layDate的使用

    效果图 官方链接 1 layui中的laydate 官方链接 2 贤心的layui 使用说明 只需引入 laydate js 即可HTML结构 lt input span class hljs keyword type span 61 sp
  • jQuery实现可以编辑的表格实例详解

    效果图 点击单个可以进行修改 点击修改所有的表格都可以进行修改 点击保存所有的数据可以获取并打印出来 本人demo需要引入jq文件 代码见如下 xff08 有详细的注解 xff09 span class hljs doctype lt DO
  • input上传图片并预览

    首先说一下input 大家都知道上传文件 xff0c 图片是通过input 的file进行上传的 1 首先是样式 大家都知道input在HTML的代码为 lt input type 61 34 file 34 gt xff1b 在页面的样式
  • PyQt5 使用QT Desinger 布置QChartViewer

    QChartView原来是QT公司的商用包 xff0c 后来开源了 但是相对来说文档说明少 最近想利用QT DESINGER直接拖拉拽在GUI窗体里放QChartViewer xff0c 网上参考部分资料后顺利实现 xff0c 现留作备忘
  • js拳皇特效

    js拳皇特效 效果图 很简单的特效 xff0c 运用了面向对象 xff0c 原型等简单的方法 废话不多说 xff0c 上代码 xff1a span class hljs tag lt span class hljs title script
  • 微信小程序从入门到放弃(七)

    scroll view不显示滚动条 新版本的微信小程序已经把scroll view的滚动条默认为隐藏了 xff0c 而有的业务逻辑需要把滚动条显示出来 xff1b 所以 xff1a 本人查了好久终于找到了解决的方案 xff0c 就是找到滚动
  • cookie+bootstrap-table+抽奖概率算法

    span class hljs comment 获得cookie span span class hljs function span class hljs keyword function span span class hljs tit
  • Vue新手入门-1

    基于vue2 5 9版本 数据绑定v bind 像img这样的标签 xff0c 直接在src里面写 lt img src 61 34 picimg 34 alt 61 34 34 gt xff1b 是不正确的 xff0c 这里需要用v bi
  • Vue新手入门-2

    基于vue2 5 9版本 生命周期vue1 0 created gt beforeCompile gt compiled gt ready gt attached gt detached gt beforeDestroy gt destro
  • cropper.js 裁剪图片并上传(文档翻译+demo)

    官网http fengyuanchen github io cropper 文档https github com fengyuanchen cropper blob master README md v3 x版本 引入 43 使用 span
  • Vue新手入门-3

    基于vue2 5 9版本 定义全局组件 xff08 3种写法 xff09 首先声明一个new Vue xff08 xff09 xff1b 然后在js里面编写 xff1b 最后把注册的组件放入进去即可 xff1b 写法 1 span clas
  • Vue遇到的bug-02(vue中修改了数据但视图无法更新的情况)

    基于vue2 5 9版本 vue中修改了数据但视图无法更新的情况 最近的项目需要用vue处理数组和json的数据类型发现一些问题在这里简单的列举一下 xff1b 因为 JavaScript 的限制 xff0c Vue js 不能检测到下面数
  • Vue遇到的bug-03(VUE之使用高德地图API)

    步骤一 xff1a 申请高德地图密钥 xff1b 步骤二 xff1a 在index html中添加高德地图JavaScript API接口 xff1b span class hljs tag lt span class hljs title
  • 纯css模仿微信switch开关按钮

    业务需要需要做一个微信switch开关 效果图 html样式 span class hljs tag lt span class hljs title label span gt span span class hljs tag lt sp
  • SDN实验环境的搭建UBUNTU 14LTS+MININET+RYU

    RYU是NTT主推的开源SDN 控制器项目 xff0c 采用PYTHON语言 因为工作需要 xff0c 进行了一些尝试 xff0c 现将基础环境的搭建和相关参考资料记录如下 1 系统选择UBUNTU 14 LTS xff0c 采用VMWAR
  • 移动端开发小记

    meta 在我们开发移动端的时候 xff0c 首先在head里面写入如下的代码 span class hljs tag lt span class hljs title meta span span class hljs attribute
  • less 简单用法

    less 示例 声明变量 用 64 span class token atrule span class token rule 64 man color span span class token punctuation span f0f0
  • javascript性能优化(1)

    加载 1 javascript的第一条定律 xff1a 将脚本 xff08 js xff09 放到底部 2 每一个http请求都会造成额外的性能负担 xff0c 下载一个100k的文件比下载四个25k的文件要快 xff1b 减少引用外部脚本
  • javascript性能优化(2)

    数据访问 四种基本数据类型 xff1a 1 直接量 xff1a 仅是自身不存储于特定位置 包括 xff1a 字符串 数字 布尔值 对象 数组 函数 正则表达式 xff0c 具有特殊意义的空值 xff0c 以及未定义 2 变量 xff1a v

随机推荐

  • javascript性能优化(3)

    DOM编程 1 文档对象模型 xff08 DOM xff09 访问的dom越多 xff0c 代码的执行速度就越慢 2 innerHtml和DOM方法 更改dom的时候 xff0c 使用innerHTML xff08 字符串拼接 xff09
  • javascript性能优化(4)

    算法和流程控制 代码整体结构是执行速度的决定因素之一 代码量少不一定运行速度快 xff0c 代码量多也不一定运行速度慢 性能损失与代码组织方式和具体问题解决办法直接相关 循环 1 减少对象成员和数组项查找的次数 span class hlj
  • javascript性能优化(5)

    字符串和正则表达式 span class hljs keyword str span 61 span class hljs string 34 a 34 span 43 span class hljs string 34 b 34 span
  • javascript性能优化(6)

    响应接口 长运行脚本 xff08 500万以上 xff09 最好的办法就是避免他们 接口最好在100毫秒响应用户输入 用定时器让出时间片 当一些JavaScript任务不能再100ms之内完成的时候 xff0c 最好的办法就是 xff1a
  • 一些简单的JavaScript加密/解密

    UTF8编码与解码 xff1a span class hljs function span class hljs keyword function span span class hljs title encodeUTF8 span spa
  • git的基本操作

    新上手一个项目 xff0c 难免会忘记git的一些操作指令 xff0c 于是趁现在工作不是很忙 xff0c 自己便整理一下git的一些基本指令 git拉取远程数据 xff0c 并建立新的分支 git clone url 克隆远程仓库代码 g
  • git clone 加速方法

    查询github global ssl fastly net和github com的IP 安装查询工具 xff1a sudo apt install dnsutils nslookup github com nslookup github
  • javascript性能优化(7)

    Ajax 异步 JavaScript 和 XML Ajax 是高性能 JavaScript 的基石 它可以通过延迟下载大量资源使页面加载更快 它通过在客户端和服 务器之间异步传送数据 xff0c 避免页面集体加载 它还用于在一次 HTTP
  • javascript性能优化(8)

    Programming Practices 编程实践 避免二次评估 JavaScript 与许多脚本语言一样 xff0c 允许你在程序中获取一个包含代码的字符串然后运行它 有四种标准 方法可以实现 xff1a eval xff0c Func
  • 编写可维护的JavaScript-编程风格

    可以使用JSHint对代码进行检查 代码规范可以是使开发更高效 基本的格式化 缩进层级 使用制表符进行缩进 Tab使用空格进行缩进 语句结尾 是不是使用分号看个人喜好 xff0c 书上推荐是不使用 xff1b 但是jshint等工具 xff
  • 编写可维护的JavaScript-编程实践

    UI层的松耦合 1 将JavaScript从css中抽离出来 xff1b 现在大部分已经不支持 xff1b 2 将css从JavaScript中抽离出来 不要直接在js内添加样式 xff1b 如 xff1a e style color 61
  • 编写可维护的JavaScript-自动化

    自动化的利弊 优点 xff1a 本地的源代码不必同生产环境保持一致 xff0c 所以你可以任意组织你的代码结构而不必担心在服务器上使用的代码是否需要优化 静态分析可以自动发现错误 在部署之前有多种方式处理JavaScript xff0c 比
  • ECMAScript 6 入门-Babel

    配置文件 babelrc 直接在项目的跟目录下建立 babelrc的文件 xff1b 具体方法 xff1a 可以在控制台输入echo null gt babelrc xff1b 回车即可 该文件用来设置转码规则和插件 xff0c 基本格式如
  • ECMAScript 6 入门-变量的解构赋值

    数组的解构赋值 原文链接 详细的内容我就不说了 xff0c 大家自己打开链接自己看看吧 xff0c 我再怎么说也是拾人牙慧 xff1b 我只是摘抄一段放入博客内吧 xff1b 用途 变量的解构赋值用途很多 xff08 1 xff09 交换变
  • ECMAScript 6 入门-字符串的扩展

    codePointAt charAt 方法可返回指定位置的字符 用法 xff1a stringObject charAt index xff1b 参数 xff1a index 必需 表示字符串中某个位置的数字 xff0c 即字符在字符串中的
  • ECMAScript 6 入门-正则的扩展

    原文http es6 ruanyifeng com docs regex 正则的扩展 字符串的正则方法 字符串对象共有 4 个方法 xff0c 可以使用正则表达式 xff1a match replace search 和split matc
  • ECMAScript 6 入门-函数的扩展

    原文链接http es6 ruanyifeng com docs function 函数参数的默认值 ES6 允许为函数的参数设置默认值 xff0c 即直接写在参数定义的后面 function span class hljs keyword
  • CentOS 云镜像 CloudImage 版本对应下载

    因为要在OpenStack内创建CentOS 7 4的qcow2格式镜像 xff0c 所以去http cloud centos org centos 7 images 上下载 发现没有显式的标明CentOS 版本 xff1a 不过 xff0
  • ECMAScript 6 入门-数组的扩展

    原文http es6 ruanyifeng com docs array Array from 扩展运算符 扩展运算符 xff08 spread xff09 是三个点 xff08 xff09 它好比 rest 参数的逆运算 xff0c 将一
  • 使用递归-实现二维矩阵数组

    废话不多说 xff0c 直接上代码 xff1a 函数递归 把 1 2 3 4 5 6 得到 1 3 5 1 3 6 1 4 5 arr 需要递归的数组 1 2 3 4 5 6 function diguiArrData arr if arr