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);
}