JS 通过年份获取月,季度,半年度,年度

​功能描述:

实例化一个函数,给函数内传递不同的参数,获取从起始年份到现在年度所有的月份,季度,半年度,年度

动态演示

---------正文代码开始--------

1. 封装函数 createMonth 注:此代码可直接复制黏贴使用

function createMonth() {let typeText="";let today = new Date();// 获取当前的年let currentYear = today.getFullYear();// 获取当前的月份let currentMonth = today.getMonth() + 1;// 输出数据this.arr = [];this.type = "";this.year = "";this.currentMonth = currentMonth;this.currentYear = currentYear;// 初始化函数,页面进来先调用init函数/*year: 接收字符串类型的4位数字年份type: 1 月度,2 季度,3 半年度,4 年度 isCurrentMonth:是否展示当前的月份,季度,半年度,年度isCurrentMonth=false 不展示isCurrentMonth=true 展示实例化createMonth函数后, 调用init函数回将生成的数据 return 出去,每次生成新的数据*/this.init = function(year, type,isCurrentMonth=false) {this.type = type;this.year= year;this.arr = [];this.isCurrentMonth=isCurrentMonth;this.setYear();this.setType();return this.arr;}// 处理接受到的type值/*处理接受到type类型,如果没有值,就赋默认值月即1*/this.setType = function() {// type 不存在就赋默认值为4let type=this.type || 1;if (type == 1) {// 月度typeText = '月';this.setMonthData();} else if (type == 2) {// 季度typeText = '季度';this.setQuarterData();} else if (type == 3) {// 半年度typeText = '半年度';this.setSemiannualData();} else if (type == 4) {// 年度typeText = '年度';this.setYearListData();}}// 处理接受到的年份/*处理接受到的年份,如果没有值就赋默认值为当前的年*/this.setYear = function() {let year=this.year;// 判断接收到的年份是否是数值类型if (year && Object.prototype.toString.call(year) != "[object Number]") {year = Number(year);} else if (!year) {year = currentYear;}this.year = year;}// 去重 数组对象去重this.removeDuplicateObjects=function (array,label) {const obj = {};let arr=[];arr = array.reduce((total, next) => {let key=next[label]if(key){obj[key] ? '' : obj[key] = true && total.push(next)return total}}, []);return arr;}// 排序  数组属性值相同的排列到一起this.setArrSort = function(dataArr) {dataArr = JSON.parse(JSON.stringify(dataArr));return dataArr.sort((a, b) => {if ((a['year'].toString()) != (b['year'].toString())) {return (a['year'].toString()).localeCompare(b['year'].toString());}})}// 设置年度this.setYearListData = function() {// console.log('设置年度');// 设置当前年的年数据if (this.year == currentYear) {let obj = {year: this.year,val: 1,type: this.type,typeText: '年度',label: this.year + '年'}this.arr.push(obj);} else if (this.year < currentYear) {// 设置小于当前年的年数据for (let i = this.year; i <= currentYear; i++) {let obj = {year: i,val: 1,type: this.type,typeText: '年度',label: i + '年'}this.arr.push(obj);}// 是否过滤掉当前的年if(this.isCurrentMonth==false && this.type==4){this.arr.forEach((item,index,arr)=>{// 过滤掉当前的年if(item.year==currentYear){this.arr.splice(index,1);}});}}}// 设置半年度// 此处调用的年度来生成半年度this.setSemiannualData = function() {// console.log('设置半年度');// 调用年数据,用以生成上半年和下半年this.setYearListData();// 此处用了深拷贝,如若不使用深拷贝,copyArr最后的数据无法改变let copyArr = JSON.parse(JSON.stringify(this.arr));// 因为是上半年,下半年,所以使用了数据拼接,将原有数据再次拼接一次copyArr = copyArr.concat(this.arr);// 数据排序,将相同年份的数据放到一起let sortArr = this.setArrSort(copyArr);// 需要删除下标let deleteIndex=null;// 数据排序后重新赋值copyArr = sortArr;// 用以标注上半年,下半年; 1上半年,2下半年let val = 1;let label = "上半年"for (let i = 0; i < copyArr.length; i++) {// 当前月份大于6就是上半年if (currentMonth > 6 && (i % 2 == 0)) {val = 1;// 当前月份在6-12就是下半年} else if (currentMonth > 6 && currentMonth < 12 && (i % 2 != 0)) {val = 2;}label = val == 1 ? '上半年' : '下半年';copyArr[i].val = val;copyArr[i].typeText = label;copyArr[i].label = copyArr[i].year + '年' + label;// 获取当前年的下半年下标if(copyArr[i].year == currentYear && copyArr[i].val==2){deleteIndex=i;}}// 是否过滤掉当前年度下半年if(this.isCurrentMonth==false){// 移除当前年的下半年copyArr.splice(deleteIndex,1);}this.arr = copyArr;}// 设置季度// setQuarterData函数是通过月度来生成季度的this.setQuarterData = function() {// console.log('设置季度');// 调用月度this.setMonthData();let arr = [];let copyArr = JSON.parse(JSON.stringify(this.arr));copyArr = copyArr.map((item, i, arr) => {// 使用月份除以3向上取整,获取到是第几季度let val = Math.ceil(item.val / 3);item.val = val;item.label=item.year+'年'+item.val+'季度'return item;});// 因为调用了生成的月份,因此要过滤掉相同的数据arr=this.removeDuplicateObjects(copyArr,'label');this.arr = arr;}// 设置月度this.setMonthData = function() {// console.log('设置月度');// 调用年度this.setYearListData();let arr = [];let copyArr = JSON.parse(JSON.stringify(this.arr));// 最大月份let maxMonth = currentMonth;// 需要删除的数据下标let deleteIndex=null;for (let i = 0; i < copyArr.length; i++) {// 如果年份小于当前的年,最大月份赋值12,如果如果年份等于当前的年,最大月份就是当前月份if (copyArr[i].year < currentYear) {maxMonth = 12;} else if (copyArr[i].year == currentYear) {maxMonth = currentMonth;}for (let m = 1; m <= maxMonth; m++) {let obj = {year: copyArr[i].year,val: m,type: this.type,typeText: typeText,label: copyArr[i].year + '年' + m + '月'}/*过滤当前月份获取当前月份的下标, 用于删除当前的月份考虑到性能问题  所以注释掉了*/// if (copyArr[i].year == currentYear && m==currentMonth) {//   deleteIndex=m;// }arr.push(obj);}}// 是否过滤当前月份if(this.isCurrentMonth==false){// arr.splice(deleteIndex,1)arr = arr.filter(function(item) {if (item.year == currentYear) {// 移除当前的月return item.val !== currentMonth;} else {return item;}});}this.arr = arr;}
}

2. 函数解释说明

使用一下函数之前,需要先实例化createMonth函数为对象,具体看以下步骤三

2.1. this.init  初始化函数

2.11.   createMonth 实例化完成后,需要调用此函数来调用实例化函数内部其他数,给一些关键性数据赋值,并且回把生成好的数据return出去

2.12. init  函数接收三个参数  year,type,isCurrentMonth

year: 接收字符串类型的4位数字年份

type: 1 月度,2 季度,3 半年度,4 年度 

isCurrentMonth:true/false 是否展示当前的月份,季度,半年度,年度

isCurrentMonth:true 展示

isCurrentMonth:false 不展示,默认是false

当值是 false  时,使用了JS的 splice  移除了当前年,月,季度,和当前年的下半年

2.2 this.setType    处理接受到的type值,类型为数值类型

处理接受到type类型,如果没有值,就赋默认值月即1

2.3 this.setYear

处理接受到的年份,如果没有值就赋默认值为当前的年

2.4 this.removeDuplicateObjects

2.4.1. 去重 数组对象去重,在网找的方法,自己做了稍加修改

接收两个参数:array,label

array 数组对象

label 对象中过滤的key名称

2.5 this.setArrSort 排序  数组属性值相同的排列到一起

2.6 this.setYearListData  生成年数据

在生成半年度,月度数据时候,也调用了setYearListData 该函数

2.7 this.setSemiannualData    生成半年度数据

该函数里面调用了年函数setYearListData,使用深拷贝,生成了双份数据

2.8 this.setQuarterData  生成季度数据

该函数里面调用了月函数setMonthData来生成季度,通过月份除以三向上取整,获取到是第几季度

因为调用了月份函数setMonthData,导致生成的季度产生了重复数据,就是用了 removeDuplicateObjects 函数去重

2.9 this.setMonthData  生成月度数据

该函数里面调用了年函数setYearListData,用于生成对应年的月份

3. 函数调用-通过控制台查看

// 实例化 createMonth 函数 为一个对象
var start = new createMonth();
console.log("打印实例:",start);
// 调用实例化函数中的init函数传参,false 不展示当前月,季度,半年度,年
let arr1=start.init('2023', '1' ,false);
// 调用实例化函数中的init函数传参,true 展示当前月,季度,半年度,年
let arr2=start.init('2023', '1' ,true);
console.log("原始arr",start.arr);
console.log('arr1:',arr1);
console.log('arr2:',arr2);

--------正文代码结束--------

4. 函数调用-通过UI页面查看,如果上面正文已经理解,可以忽略以下UI页面演示

4.1 演出页面引用了layui,演示代码可以直接使用

4.2  引入layui依赖

// 引入layui依赖
<!-- 引入 layui.css -->
<link rel="stylesheet" href="//unpkg.com/layui@2.6.8/dist/css/layui.css"><!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.6.8/dist/layui.js"></script>

4.2 演示使用的 HTML代码

<form class="layui-form layui-form-pane" action=""><div class="layui-form-item" pane><label class="layui-form-label">选择年份</label><div class="layui-input-inline"><input type="text" class="layui-input" id="test1"></div></div><div class="layui-form-item"><label class="layui-form-label">选择类别</label><div class="layui-input-block"><input type="radio" name="sex" value="1" title="月度" lay-filter="demo-radio"><input type="radio" name="sex" value="2" title="季度" lay-filter="demo-radio"><input type="radio" name="sex" value="3" title="半年度" lay-filter="demo-radio"><input type="radio" name="sex" value="4" title="年度" lay-filter="demo-radio"></div></div><div class="layui-form-item" pane><label class="layui-form-label">是否开启</label><div class="layui-input-block"><input type="checkbox" value="false" lay-skin="switch" lay-filter="demo-checkbox-switch" lay-text="开启|关闭"><div class="layui-bg-orange">是否展示当前的月份,季度,半年度,年度</div></div></div>
</form>
<!-- 展示数据到页面上 -->
<table id="tableDemo" lay-filter="tableDemo"></table>

4.3 演示使用的相关JS代码

var start = new createMonth();
let selectYear="",selectType="",isCurrentMonth=false;
let dataArr=[];
layui.use(['laydate','form','table'], function(){var laydate = layui.laydate;var form = layui.form;var table = layui.table;var tableReload = table.reload;var $ = layui.$;// 日期触发函数laydate.render({elem: '#test1' ,//指定元素type: 'year',format: 'yyyy' ,//可任意组合done: function(value, date, endDate){//得到日期生成的值,如:2017-08-18// console.log(value);selectYear=value;dataArr = start.init(selectYear,selectType,isCurrentMonth);console.log(dataArr);createTable();//得到日期时间对象:{year: 2017, month: 8, date: 18, hours: 0, minutes: 0, seconds: 0}// console.log(date);}});// 监听单选框form.on('radio(demo-radio)', function(data){// console.log(data.elem); //得到radio原始DOM对象// console.log(data.value); //被点击的radio的value值selectType=data.value;dataArr = start.init(selectYear,selectType,isCurrentMonth);console.log(dataArr);createTable();});  // 监听开关form.on('switch(demo-checkbox-switch)', function(data){// console.log(data.elem); //得到checkbox原始DOM对象// console.log(data.elem.checked); //开关是否开启,true或者falseisCurrentMonth=data.elem.checked;dataArr = start.init(selectYear,selectType,isCurrentMonth);console.log(dataArr);createTable();// console.log(data.value); //开关value值,也可以通过data.elem.value得到// console.log(data.othis); //得到美化后的DOM对象});;
});
​
function createTable(){layui.use('table', function(){var table = layui.table;table.render({elem: '#tableDemo',id:"demoReload",height: 600,page:true,limit:12,data:dataArr,parseData: function(res){ //res 即为原始返回的数据console.log(res);},cols: [[ //表头{field: 'label', title: '名称', sort: true, fixed: 'left'},{field: 'year', title: '年份', sort: true},{field: 'typeText', title: '类型'},{field: 'val', title: 'val值'} ,{field: 'type', title: 'type值'} ]]})})
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流程图如何制作?好用的11款流程图软件盘点!

流程图是一种强大的可视化工具&#xff0c;用于清晰地展示各种过程和步骤&#xff0c;应用非常广泛&#xff0c;在各个行业中随处可见&#xff0c;凡是涉及流程步骤的场景&#xff0c;都可以用到流程图&#xff0c;那么问题来了&#xff1a;流程图如何制作&#xff1f; 这篇文…

第0章:怎么入手tensorflow

近年来人工智能的火爆吸引了很多人&#xff0c;网上相关的热门课程报名的人很多&#xff0c;但是坚持下去的人却少。那些晦涩的原理没有一定知识的积累很难能理解。 如果你对人工智能感兴趣&#xff0c;且想利用人工智能去实现某项功能&#xff0c;而不是对人工智能本身感兴趣&…

c语言练习90:反转链表

反转链表 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 与方法一相比方法二的思路更容易实现 报错原因&#xff1a;head和n3不能为空&#xff0c;为空则不能执行后面的操作 报错原因&#xff1a;listnode*n1,n2,n3; 纠正&#xff1a;listnode *n1…

Java】实现图片验证码2.0【详细代码】

实际开发过程中经常遇到要实现图片验证码来防止外部使用脚本刷接口&#xff0c;所以说图片验证码是很有必要的一个小功能。 下面这个之前发布的&#xff0c;现在发现生成的图片验证码是可以被自动化工具进行识别的&#xff0c;具有一定的安全性问题。 1.0版本验证码&#xff…

大数据开发中的秘密武器:探索Hadoop纠删码的奇妙世界

随着大数据技术的发展&#xff0c;HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了系统的可靠性&#xff0c;HDFS通过复制来实现这种机制。但在HDFS中每一份数据都有两个副本&#xff0c;这也使得存储利用率仅为1/3&#xff0c;每TB数据都需要占用3TB的存储空间。因此&…

极智项目 | 实战人脸识别签到系统

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文来介绍 实战人脸识别签到系统。 本文介绍的 实战人脸识别签到系统&#xff0c;提供完整的可以一键执行的项目工程源码&#xff0c;获取方式有两个&#xff1a…

新晋技术管理者如何推动组织变革?

技术管理者需要不断地努力改善团队状况&#xff0c;比如提升研发效能、帮助成员成长&#xff0c;或者优化组织结构等等。可以说&#xff0c;推动变革是「技术管理者」这一角色的重要使命之一。 关于变革的挑战总是复杂&#xff0c;而如何在不同的环境和问题中影响团队也是一项…

2023年【起重机械指挥】考试题库及起重机械指挥证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试题库是安全生产模拟考试一点通总题库中生成的一套起重机械指挥证考试&#xff0c;安全生产模拟考试一点通上起重机械指挥作业手机同步练习。2023年【起重机械指挥】考试题库及起重机械指挥证考试 1、…

Tengine 边缘AI计算框架移植RV1126(包括opencv的交叉编译)

目录 1.编译opencv 2.拷贝SDK源码到虚拟机 3. 拉取TIM-VX代码 4.拉取Tengine源码并配置 1.编译opencv 编译opencv是为了&#xff0c;在编译Tengine时指定OpenCVConfig.cmake,以便寻找特定的opencv动态库 01.从github拉取opencv源代码 git clone -b 4.5.5 https://github.co…

22.项目开发之量化交易抓取数据QuantTradeData(一)

项目创建及后端业务&#xff1a;定时更新“股票列表基础信息”数据 项目创建 该量化交易数据平台用于数据库的数据抓取、分析等操作。 和QuantTrade使用同一个数据库&#xff0c;无需重新创建 pom.xml <properties><java.version>1.8</java.version><pro…

华为数通方向HCIP-DataCom H12-831题库(单选题:301-310)

第301题 关于配置防火墙安全区域的安全级别的描述,错误的是 A、同一系统中,两个安全区域不允许配置相同的安全级别 B、只能为自定义的安全区域设定安全级别 C、安全级别一旦设定不允许更改 D、新建的安全区域,系统默认其安全级别为1 答案:D 解析: 新创建的安全区域缺省未…

在UniApp中使用uni.makePhoneCall方法调起电话拨打功能

目录 1.在manifest.json文件中添加权限 2. 组件中如何定义 3.如何授权 4.相关知识点总结 1.在manifest.json文件中添加权限 {"permissions": {"makePhoneCall": {"desc": "用于拨打电话"}} }2. 组件中如何定义 <template>…

成都瀚网科技有限公司:开抖音店铺有哪些注意事项?

成功经营一个小店不仅仅是发布产品视频那么简单&#xff0c;还需要注意一些重要的事情。开抖音店铺需要注意以下几点&#xff1a; 1、开抖音店铺有哪些注意事项&#xff1f; 合规管理&#xff1a;在抖音开店&#xff0c;首先要确保自己的运营合规。遵守相关法律法规及平台规定&…

分享一下怎么开发一个陪诊小程序

开发一个陪诊小程序需要综合考虑许多方面&#xff0c;包括但不限于市场需求、用户体验、技术实现和运营策略。以下是一篇以开发陪诊小程序为主题的文章。 一、背景介绍 随着社会的发展和人口老龄化的加剧&#xff0c;越来越多的老年人、病患和孕妇需要就医&#xff0c;而由于各…

地理知识笔记:Haversine距离

1 介绍 Haversine距离用于计算地球上两点之间的大圆距离当考虑地球的真实曲率时&#xff0c;它特别适用于计算两个经纬度坐标之间的距离 其中&#xff1a; 2 python 实现 def haversine_distance(lat1, lon1, lat2, lon2):R 6371 # Earth radius in kilometersdlat np.r…

斯坦福JSKarel编程机器人使用介绍

斯坦福JSKarel编程机器人使用介绍 为了避免被编程语言固有的复杂性所困扰&#xff0c;有一个被称为卡雷尔&#xff08;Karel&#xff09;机器人的微型世界&#xff08;microworld&#xff09;的简化环境&#xff0c;可以让编程初学者从中学习理解编程的基本概念&#xff0c;而…

限频差分探头N2060Apro

N2060Apro 差分探头提供一个安全的仪器给所有的示波器使用&#xff0c;它可以转换由高输入的差动电压进入一个低电压(≤7V)&#xff0c;并且显示波形在示波器上&#xff0c;使用频宽高达 200MHz&#xff0c;非常适合大电力测试、研发、维修使用。差分探头输出标示是设计在操作示…

【六、docker中hyperf项目怎么进行跨域设置】

1、第一步就是新建跨域文件,即跨域中间件 跨域中间件的代码如下 <?phpdeclare(strict_types=1);namespace App\Middleware; namespace App\Middleware; namespace App\Middleware;use Hyperf\Context\Context; use Psr\Http\Message\ResponseInterface;

【网络编程】从网络编程、TCP/IP开始到BIO、NIO入门知识(未完待续...)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

python代码调用文件或数据库中保存的脚本

这里采用的读取excel 1、先写一个测试方法 def demo5():import xlrdimport randomwb xlrd.open_workbook("code.xls")st wb.sheet_by_index(0)code st.cell_value(0, 0)list ["6666", asd, 1ad23, 1f23, 12g3, 1b3, 12r3]code2 st.cell_value(0, 1)…