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

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

 /* 函数递归  把[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))

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值