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

news2025/1/14 20:38:56

​功能描述:

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

动态演示

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

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 不存在就赋默认值为4
    let 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或者false
    isCurrentMonth=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.coloradmin.cn/o/1108428.html

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

相关文章

基于B/S架构,包括PC后台管理端、APP移动端、可视化大屏端的智慧工地源码

智慧工地管理平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程…

【java吐血整理】

又到一年求职季&#xff0c;持续更新高频java面试题 目录 java 基础JDK JRE JVM字节码final异常异常处理hashCode、equals、JAVA SE 和 JAVA EEJava 访问修饰符 public、private、protected&#xff0c;default接口和抽象类String、StringBuffer、StringBuilder为什么String不…

基于Arrow的轻量线程池

基于Arrow的轻量线程池 大家好&#xff0c;我是光城&#xff0c;最近花了几周业余时间&#xff0c;开发出这款轻量线程池&#xff0c;代码也全部开源啦&#xff0c;欢迎大家star。 本线程池的设计与实现会有涉及非常多的知识&#xff0c;这些内容也都会以视频的方式分享在知识星…

CUDA编程入门系列(三) CUDA编程模型

一、GPU计算基础知识 CUDA编程模型是一个异构模型,需要CPU和GPU协同工作。 在CUDA中,host和device是两个重要的概念,我们用host指代CPU及其内存,而用device指代GPU及其内存。 CUDA程序中既包含host程序,又包含device程序,它们分别在CPU和GPU上运行。 host手dev…

【常用图像增强技术,Python-opencv】

文章目录 常用图像增强技术调整大小灰度变换标准化随机旋转中心剪切随机裁剪高斯模糊亮度、对比度和饱和度调节水平翻转垂直翻转高斯噪声随机块中心区域 常用图像增强技术 图像增强技术是常用于数据增强的方法&#xff0c;可以帮助增加数据集中图像的多样性&#xff0c;提高深…

VR智能家居虚拟连接仿真培训系统重塑传统家居行业

家居行业基于对场景的打造及设计&#xff0c;拥有广阔前景&#xff0c;是众多行业里面成为最有可能进行元宇宙落地的应用场景之一。 家居行业十分注重场景的打造及设计&#xff0c;而元宇宙恰恰能通过将人工智能、虚拟现实、大数据、物联网等技术融合提升&#xff0c;带来身临其…

关于ABB机器人安全区域设定

关于ABB机器人安全区域设定&#xff0c;需要开通608-1功能选项&#xff0c;才可以使用 也可以在系统信息-选项查看 关于范围设置最好设置局部&#xff0c;不然设置全局其他地方会占用&#xff0c;后续处理故障麻烦 储存类型设置常量&#xff0c;应为区域是固定值 关于pos1和pos…

vue3后台管理系统之登录界面和业务的实现

1.静态页面的搭建 <template><div class"login_container"><el-row><el-col :span"12" :xs"0" /><el-col :span"12" :xs"24"><!-- 登录的表单 --><el-form ref"loginForms&qu…

用 JHipster Azure Spring Apps 构建和部署 Spring 应用

作者&#xff1a;Hang Wang 排版&#xff1a;Alan Wang 此教程将向您展示如何使用 React、Spring Boot 和 PostgreSQL 在 Azure 上构建和部署全栈 Web 应用程序&#xff0c;由 JHipster Azure Spring Apps 提供支持。 JHipster Azure Spring Apps 为全栈 Web 开发提供了全面的…

单链表的相关操作(初阶--寥寥万字不成敬意)

目录 链表的概念 链表的相关操作&#xff1a; 链表的创建&#xff1a; 打印链表&#xff1a; 申请新节点&#xff1a; 链表的尾插&#xff1a; &#xff01;&#xff01;&#xff01;对于传参中二级指针的解释&#xff1a; 链表的头插&#xff1a; 链表的尾删&#xff…

常用JS加密/解密类型以及案例

简介 这里给大家汇总常用不常用的JS加密案例&#xff0c;免得大家用的时候到处去找例子。 正题 对称加密&#xff1a; 替代字符表示法&#xff1a;使用Base64或类似的编码对数据进行简单的转换&#xff0c;不过这并不是真正的加密&#xff0c;而只是一种表示形式的转换。 &l…

uni-app--》基于小程序开发的电商平台项目实战(七)完结篇

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

OSG粒子系统特效-----雨雪、爆炸、烟雾

1、烟雾效果 飞机坠毁 陨石坠落 源码&#xff1a; // CMyOSGParticle.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <windows.h> #include <osgViewer/Viewer>#include <osg/Node> #inc…

动态规划:从入门到入土系列(二)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 前言 一、…

AI AIgents时代-(五.)Autogen

由微软开发的 Autogen 是一个新的 Agents 项目&#xff0c;刚一上线就登上GitHub热榜&#xff0c;狂揽11k星✨✨✨ 项目地址&#xff1a;https://github.com/microsoft/autogen Autogen 允许你根据需要创建任意数量的Agents&#xff0c;并让它们协同工作以执行任务。它的独特之…

LeetCode算法栈—有效的括号

目录 有效的括号 用到的数据结构&#xff1a; 位运算、Map 和 Stack Stack 常用的函数&#xff1a; 题解&#xff1a; 代码&#xff1a; 运行结果; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符…

SpringBoot2.x简单集成Flowable

环境和版本 window10 java1.8 mysql8 flowable6 springboot 2.7.6 配置 使用IDEA创建一个SpringBoot项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.…

GitHub下载太慢的解决方案

修改hosts文件&#xff1a; windows的hosts文件在 C:\Windows\System32\drivers\etc\hosts cmd管理员运行命令notepad C:\Windows\System32\drivers\etc\hosts 然后cmd命令重启网络ipconfig /flushdns windows修改hosts Ubuntu22.04修改hosts sudo vim /etc/hosts # This fil…

RK3288 Android11 mini-pcie接口 4G模组EC200A适配(含自适应功能)

这里写目录标题 1、修改驱动内核配置①使能USBNET功能②使能 USB 串口 GSM、CDMA 驱动③使能 USB 的 CDC ACM模式④使能PPP功能 2、使用lsusb命令查看是否识别到usb接口的“EC200A”4G模组3、在drivers/usb/serial/option.c添加VID和PID信息①添加VID和PID定义②在option_ids 数…

找寻openSUSE的前世今生

找寻开始的地方 在一些资产管理平台、网管系统&#xff0c;完全依赖资产录入资产&#xff0c;假如存在SUSE类型网元&#xff0c;能否将SLES和openSUSE一同接入到SUSE类型下&#xff0c;就有待商榷了。 SLES和openSUSE是两个不同的Linux发行版&#xff0c;更准确说是两个不同的…