element表格底部合计功能--给定的多维数组和键值获取函数,创建一个可查找特定键对应值的函数(JS自己写函数)

news2024/11/27 5:36:33

效果图如下:

代码:

import { flattenDeep } from "lodash";

export function getFinder(array, getKey, getVal = (item, index) => item) {
  const store = new Map();
  const eles = flattenDeep(array);
  eles.forEach((ele, index) => {
    const key = getKey(ele, index);
    store.set(key, getVal(ele, index));
  });
  return (key) => store.get(key);
}

export function getIndexFinder(array, key) {
  return getFinder(
    array,
    (item) => item[key],
    (_, index) => index
  );
}

//这里的customTable是对element table进行二次封装的  直接用原生的也可
<div style="margin-top: 25px">
          <CustomTable
            ref="contractTable"
            stripe
            :data="list"
            :rules="rules"
            :column.sync="columns"
            :table-id-name="$route.path"
            row-key="index"
            :reserve-selection="true"
            min-height="400"
            max-height1="500"
            :summary-method="getSummaries"
            show-summary
            :options="options"
            @selection-change="handleSelectionChange"
          />
        </div>

 methods: {
      getSummaries(param) {
        try {
          const data = param.data;
          console.log("data", data);
          const sums = ["合计"];
          const columns = this.columns;
          const getIndex = getIndexFinder(columns, "prop");

          sums[getIndex("money")] = 0;
          sums[getIndex("num")] = 0;

          data.forEach((v) => {
            sums[getIndex("money")] += +v.money || 0;
            sums[getIndex("num")] += +v.num || 0;
          });
          sums[getIndex("money")] = (+sums[getIndex("money")] || 0).toFixed(2);
          console.log("sums", sums);
          return sums;
        } catch (error) {
          console.log("summary error", error);
        }
      },
 }


//list数据
/*
 list: [
          {
            setPrdCode: "123",
            setProductName: "销售奖123",
            setProductName2: "销售奖345",
            setProductStatus: "Y",
            setProductStatusName: "生效",
            salesOrgCode: ["A000000000", "A001000000"],
            salesOrgName: "网络大区",
            money: 653.33,
            num: 33,
            productLineCode: ["PL004", "PL011"],
            productLineName: "TCL_CICO产品线,乐华_智屏产品线",
          },
          {
            setPrdCode: "8888",
            setProductName: "销售奖888",
            setProductName2: "销售奖999",
            setProductStatus: "N",
            setProductStatusName: "失效",
            salesOrgCode: ["A000000000", "A001000000", "A001010000"],
            salesOrgName: "东北大区",
            money: 888.88,
            num: 12,
            productLineCode: ["PL007", "PL011"],
            productLineName: "TCL_商用产品线,乐华_智屏产品线",
          },
          {
            setPrdCode: "6666",
            setProductName: "销售奖666",
            setProductName2: "销售奖555",
            setProductStatus: "N",
            setProductStatusName: "失效",
            salesOrgCode: ["A200000000"],
            money: 899.88,
            num: 15,
            salesOrgName: "合肥白家电BU",
            productLineCode: ["PL006", "PL005"],
            productLineName: "TCL_健康电器,TCL_综合产品线",
          },
        ],
*/

方法解释:

getFinder

编辑这段代码定义了一个名为getFinder的函数。让我们一步一步解释它的功能和实现细节:

  1. 首先,函数接受三个参数:arraygetKeygetVal。其中,array是一个多维数组,getKey是一个函数,getVal是一个可选的函数,默认为匿名函数 (item, index) => item
  2. 在函数内部,创建了一个新的Map对象,用于存储数据。
  3. flattenDeep是一个用于将多维数组转化为一维数组的函数。通过调用flattenDeep(array)将多维数组array转化为名为eles的一维数组。
  4. 使用forEach方法遍历eles数组中的每个元素,并传入当前元素ele和索引index
  5. 在每次迭代中,通过调用getKey(ele, index)获取当前元素的键值,并将其作为键,使用getVal(ele, index)作为值,将键值对存储到storeMap对象中。
  6. 最后,函数返回一个新的函数,这个新函数接受一个参数key,并通过调用store.get(key)store中获取相应的值并返回。

总结起来,getFinder函数的目的是根据给定的多维数组和键值获取函数,创建一个可查找特定键对应值的函数。这个函数在调用时,根据给定的键,返回存储在store中的对应值。

getIndexFinder

这段代码定义了一个名为getIndexFinder的函数。让我们一步一步解释它的功能和实现细节:

  1. getIndexFinder函数:该函数接受两个参数:array和key,并返回调用getFinder函数的结果。
    • array:要转换的多维数组。
    • key:用于从数组的每个元素获取键的键名。
  1. 在函数内部,它调用getFinder函数,并传递了适当的参数:array作为转换的多维数组,(item) => item[key]作为获取键的函数,以及(_, index) => index作为获取值的函数(该函数返回元素的索引)。最后,返回getFinder函数的结果。

因此,getIndexFinder函数的目的是提供一个简化的方法来获取多维数组中特定键的值的函数。它利用了getFinder函数,并通过传递适当的参数来实现这个目标。

getFinder函数例子(动态给Form添加属性)

博主还同样项目使用这个SchemaForm这个组件 Element Schema Form跳转链接

      <template slot="panel-main">
        <el-form
          ref="filterForm"
          class="list-schema-form"
          :model="schema_model"
          :inline="true"
          label-position="top"
        >
          <schema-form
            :model="schema_model"
            :layout="layout"
            :schema="schema_list"
            :options="options"
          ></schema-form>
        </el-form>
      </template>

schema_list的数据

schema_list: [
        [
          {
            type: "input",
            prop: "setProductCode",
            formItem: { label: "销售件编码/名称" },
            attrs: {
              placeholder: "请输入需要查询的编码/名称",
              clearable: true,
            },
          },
          {
            type: "input",
            prop: "itemProductCode",
            formItem: { label: "制造件编码/名称" },
            attrs: {
              placeholder: "请输入需要查询的编码/名称",
              clearable: true,
            },
          },
          {
            type: "input",
            prop: "itemProductCode",
            formItem: { label: "制造件型号" },
            attrs: {
              placeholder: "请输入需要查询的型号",
              clearable: true,
            },
          },
          {
            type: "select",
            prop: "setProductStatus",
            formItem: { label: "销售件状态", clearable: true },
            attrs: { placeholder: "请选择" },
          },
        ],
        [
          {
            type: "select",
            prop: "itemProductstatus",
            formItem: { label: "制造件状态" },
            attrs: { placeholder: "请选择", clearable: true },
          },
          {
            type: "datepicker",
            prop: "beginTime",
            formItem: { label: "时间(起)" },
            attrs: {
              placeholder: "请选择时间(起)",
              valueFormat: "yyyy-MM-dd 00:00:00",
            },
          },
          {
            type: "datepicker",
            prop: "endTime",
            formItem: { label: "时间(止)" },
            attrs: {
              placeholder: "请选择时间(止)",
              valueFormat: "yyyy-MM-dd 23:59:59",
            },
          },
          {},
        ],
      ],

我们可以通过上面的定义的getFinder函数来处理一些我们想要的操作,比如增加对应的属性hide隐藏,增加rules属性来进行一些校验,最主要用到onchange事件,选择了对应的状态,显示不同的数据和是否需要必填等操作

举个简单的例子

未做任何操作时的界面

简单在created生命周期直接操作,代码如下

  const findId = getFinder(this.schema_list, (item) => item.prop);
      console.log("findId", findId);
      const colId = (prop) => findId(prop) || {};
      console.log("colId", colId("setProductStatus"));
      colId("setProductStatus").hide = true;
      colId("itemProductstatus").rules = this.isReturnProductFlag
        ? []
        : [
            {
              required: true,
              message: "此项为必填项",
              trigger: "change",
            },
          ];

做完操作后的界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv鼠标事件函数setMouseCallback()详解

文章目录 opencv鼠标事件函数setMouseCallback()详解1、鼠标事件函数&#xff1a;&#xff08;1&#xff09;鼠标事件函数原型&#xff1a;setMouseCallback()&#xff0c;此函数会在调用之后不断查询回调函数onMouse()&#xff0c;直到窗口销毁&#xff08;2&#xff09;回调函…

Virtuoso: 工艺库、仿真模型

1、添加仿真模型时&#xff0c;仿真模型有.scs和.lib的格式&#xff0c; 感谢这个大佬的解惑&#xff01;附上他的文章链接&#xff1a;Virtuoso 工艺库安装方法&#xff08;小白版&#xff09; - 知乎 添加.lib格式模型就如下&#xff1a; 2、各大MOS的Level仿真模型 引用: H…

pytorch异常——RuntimeError:Given groups=1, weight of size..., expected of...

文章目录 省流异常报错异常截图异常代码原因解释修正代码执行结果 省流 nn.Conv2d 需要的输入张量格式为 (batch_size, channels, height, width)&#xff0c;但您的示例输入张量 x 是 (batch_size, height, width, channels)。因此&#xff0c;需要对输入张量进行转置。 注意…

Mybatis中 list.size() = 1 但显示 All elements are null

一、Bug展示 二、原因分析 2.1.情形一&#xff1a;Mybatis的XML中返回类型映射错误 <select id"selectByDesc" parameterType"com.task.bean.OrderInfo"resultType"com.task.bean.OrderInfo">select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_S…

十七、命令模式

一、什么是命令模式 命令&#xff08;Command&#xff09;模式的定义&#xff1a;将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行储存、传递、调用、增加与管理。   命令…

使用element-ui中的el-table回显已选中数据时toggleRowSelection报错

最近在写一个后台&#xff0c;需要在表格中多选&#xff0c;然后点击编辑按钮的时候&#xff0c;需要回显已经选中的表单项 <el-table v-loading"loading" :data"discountList" :row-key"(row) > row.id" refmultipleTable selection-cha…

蓝牙链接上的标准串行 (COMx)

1 Preface/Foreword 电脑与蓝牙设备&#xff08;手机&#xff0c;音响&#xff09;连接时&#xff0c;电脑会虚拟出一个串口设备&#xff0c;并在设备管理其中的串口模块下列出。 2 删除方法 在已配对的设备列表中将设备移除。

【Centos8_配置单节点伪分布式Spark环境】

安装centos8 jdk部署伪分布式spark环境 安装Centos8 环境下的JDK 下载jdk linux版本 下载链接&#xff1a; jdk-8u381-linux-x64.tar.gz 将该文件上传到Centos8 主机 部署配置jdk&#xff08;java8&#xff09; # 解压到指定路径 [lhangtigerkeen Downloads]$ sudo tar …

初始react和使用——事件处理、样式处理和组件

一、react官网 1、官网下载 官网分别有中英文两种&#xff1a; 中文官网&#xff1a;React 官方中文文档 – 用于构建用户界面的 JavaScript 库 英文官网&#xff1a;https://reactjs.org/ 2、react简介 react是用于构建用户界面的JavaScript库&#xff0c;起源于Facebook的…

Python入门自学进阶-Web框架——40、redis、rabbitmq、git——3

git&#xff0c;一个分布式的版本管理工具。主要用处&#xff1a;版本管理、协作开发。 常见版本管理工具&#xff1a; VSS —— Visual Source Safe CVS —— Concurrent Versions System SVN —— CollabNet Subversion GIT GIT安装&#xff1a;下载安装文件&#xff1a;…

Nexus仓库介绍以及maven deploy配置

一 、Nexus仓库介绍 首先介绍一下Nexus的四个仓库的结构&#xff1a; maven-central 代理仓库&#xff0c;代理了maven的中央仓库&#xff1a;https://repo1.maven.org/maven2/&#xff1b; maven-public 仓库组&#xff0c;另外三个仓库都归属于这个组&#xff0c;所以我们的…

Oracle21C--Windows卸载与安装

卸载方法&#xff1a; &#xff08;1&#xff09;WinR&#xff0c;输入services.msc,打开服务&#xff0c;把Oracle相关的服务全部停止运行&#xff08;重要&#xff09; &#xff08;2&#xff09;WinR&#xff0c;输入regedit&#xff0c;打开注册表&#xff0c;删除Oracle开…

国产芯片设备达到3纳米,还打入台积电,美日荷被彻底赶出市场

由于众所周知的原因&#xff0c;荷兰和日本的光刻机对中国供应面临限制&#xff0c;其他芯片设备和材料也受到很大的限制&#xff0c;这促使国产芯片产业链积极完善&#xff0c;以实现纯国产芯片工艺&#xff0c;虽然在光刻机方面还稍微落后&#xff0c;不过有一项国产芯片设备…

Maven入门教程(三):Maven语法

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 6.Mav…

2023年高教社杯数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…

Qt按钮按动、划过背景设置

title: Qt按钮按动、划过背景设置 date: 2023-08-30 19:29:49 tags: Qt按钮按钮背景设置按钮动态效果 categories:Qt学习之路 给按钮添加背景后&#xff0c;原先按钮的按动效果就没了&#xff0c;&#xff08;按钮没有反馈&#xff0c;我的手就会一直在抖&#xff0c;哈哈哈哈…

最新社区团购电商小程序源码 无bug完美运营版+详细搭建部署教程

分享一个开源社区团购电商小程序源码&#xff0c;无bug完美运营版&#xff0c;含完整前后端详细搭建部署教程。 系统运营模式&#xff1a;整合线下社区资源&#xff0c;由各快递代收点、社区便利店、社区物业、业主等发起的社区微信群&#xff0c;推送商品信息&#xff0c;消费…

leetcode原题: 最小值、最大数字

题目1&#xff1a;最小值 给定两个整数数组a和b&#xff0c;计算具有最小差绝对值的一对数值&#xff08;每个数组中取一个值&#xff09;&#xff0c;并返回该对数值的差 示例&#xff1a; 输入&#xff1a;{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8} 输出&#xff1a;3&…

运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 一&#xff1a; $(cd $(dirname $0); pwd) 命令详解 path $(cd $(dirname $0); pwd)解析&#xff1a; 1、取当前运行脚本的所在路径&#xf…

【AI模型】LibTorch深度学习框架配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍LibTorch深度学习框架配置与使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…