项目常用小方法集合

文章提供了三个JavaScript功能实现:1)将文件大小转换为KB,MB,GB,TB;2)计算数据对象中特定键值的总和;3)使用asyncPool函数控制并发执行,确保不超过指定的最大并发限制。这些功能在处理文件信息和优化异步操作时非常实用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.文件size转换

 function getFileSize(size) {
        if (!size) return "N/A";
        var num = 1024; //byte
        if (size < num) return size + "B";
        if (size < Math.pow(num, 2)) return (size / num).toFixed(2) + "K"; //kb
        if (size < Math.pow(num, 3))
          return (size / Math.pow(num, 2)).toFixed(2) + "M"; //M
        if (size < Math.pow(num, 4))
          return (size / Math.pow(num, 3)).toFixed(2) + "G"; //G
        return (size / Math.pow(num, 4)).toFixed(2) + "T"; //T
      }

2.数据对象key求和

let arr = [
        {
          a: 1,
          b: 0,
          c: 0,
          d: 0,
          name: "999"
        },
        {
          a: 10,
          b: 2,
          c: 0,
          d: 0,
          name: "999"
        },
        {
          a: 0,
          b: 0,
          c: 3,
          d: 0,
          name: "999"
        }
      ];
      let keys = Object.keys(arr[0]).filter((item) => item != "name");
      let b = arr.reduce((pre, next) => {
        keys.forEach((item) => {
          pre[item] = pre[item] ? pre[item] : 0;
          pre[item] += next[item];
        });
        return pre;
      }, {});

输出:

3.控制并发数

 /**
     * @params {Number} poolLimit -最大并发限制数
     * @params {Array} array -所有的并发请求|渲染数组
     * @params {Function} iteratorFn -对应执行的并发函数(接受 array 的每一项值)
     */
    async function asyncPool(poolLimit, array, iteratorFn) {
      const ret = []; // 所有执行中的 promises
      let executing = []; // 正在执行中的 promises
      for (const item of array) {
        //接受 iteratorFn 的返回值:Promise
        const p = Promise.resolve().then(() => iteratorFn(item));
        ret.push(p);
        // 如果执行的数组 大于等于 最大并发限制 那么我们就要控制并发
        if (array.length >= poolLimit) {
          const e = p.then(() => executing.splice(executing.indexOf(e), 1));
          // p.then 返回的 一个Promise 我们把它放到正在执行数组中,一旦执行完 便剔除对应的值
          executing.push(e);
          //核心代码:正在执行的 promises 数组 大于等于 `最大并发限制` 用.race 方法释放一个执行最快的
          if (executing.length >= poolLimit) await Promise.race(executing);
        }
      }
      //返回一个 Promise.all
      return Promise.all(ret);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值