工具函数整理合集

305 阅读2分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

这是记录使用过的工具函数,有自己写的有以前网上找的。整合自己常用的代码。

递归处理树状结构的数据

不知道这算尾递归还是柯里化...

树 ==> 列表

function toList(params, list = []) {
    params.forEach(v => {
        if (!v.children || v.children.length == 0) {
            delete v.children;
        }
        list.push(v)
        if (v.children?.length > 0) {
            toList(v.children, list)
        }
    })
    return list;
}

列表 ==> 树

function toTree(params, pid = 0) {
    let arr = []
    params.forEach(v => {
        if (v.pid == pid) {
            let obj = {
                ...v,
            }
            toTree(params, v.id)?.length > 0 ? obj.children = toTree(params, v.id) : '';
            arr.push(obj)
        }
    })
    return arr;
}

node下载

使用request请求资源用fs创建一个写入流

const request = require("request");
const fs = require("fs");
const path = require("path");
let stream = fs.createWriteStream(
    path.join("./", 'xxx.xxx')
);
request(
    {
        method: 'get',
        url:'xxx',
    }
    )
    .pipe(stream)
    .on("close", function () {
        console.log(
            "文件[" + 'xxx.xxx' + "]下载完毕"
        );
    });

node起一个服务可以访问指定文件

纯属好玩... 这类似的工具很多的而且很好用如:webpack,gulp。

const http = require("http");
const fs = require("fs");
const server = http.createServer(function (req, res) {
    //设置响应头
    console.log(req.url)
    res.writeHead(200, {
        "Content-Type": "text/html;charset=UTF-8"
    })
    //设置访问的url路径
    if (req.url == "/" || req.url == "/text") {
        //路径为相对路径,也就是说与这个js文件同级的有一个html文件
        fs.readFile("./2.html", function (err, data) {
            res.writeHead(200, {
                "Content-Type": "text/html;charset=UTF-8"
            });
            res.end(data);
        });
    }
})


server.listen(8888, function () {
    console.log('running at 8888......');
    console.log('http://localhost:8888');
});

node掘金抽奖梭哈

var request = require('request');
let url = 'https://api.juejin.cn/growth_api/v1/lottery/draw';
let headers = {
    "cookie": "",
    "content-type": "application/json"
}
let options = {
    method: 'post',
    url,
    form: {},
    headers
};
request({
    method: 'get',
    url:'https://api.juejin.cn/growth_api/v1/get_coder_calendar',
    headers
}, function (err, res, body) {
    if (err) {
        console.log(err);
    } else {
        console.log(body);
    }
})
for (let i = 0; i < 100; i++) {
    request(options, function (err, res, body) {
        if (err) {
            console.log(err,'['+i+']');
        } else {
            console.log(body,'['+i+']-------');
        }
    })

}

//数字转中文
function convertToChinaNum(num) {
    var arr1 = new Array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
    var arr2 = new Array('', '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千','万', '十', '百', '千','亿');//可继续追加更高位转换值
    if(!num || isNaN(num)){
        return "零";
    }
    var english = num.toString().split("")
    var result = "";
    for (var i = 0; i < english.length; i++) {
        var des_i = english.length - 1 - i;//倒序排列设值
        result = arr2[i] + result;
        var arr1_index = english[des_i];
        result = arr1[arr1_index] + result;
    }
    //将【零千、零百】换成【零】 【十零】换成【十】
    result = result.replace(/零(千|百|十)/g, '零').replace(/十零/g, '十');
    //合并中间多个零为一个零
    result = result.replace(/零+/g, '零');
    //将【零亿】换成【亿】【零万】换成【万】
    result = result.replace(/零亿/g, '亿').replace(/零万/g, '万');
    //将【亿万】换成【亿】
    result = result.replace(/亿万/g, '亿');
    //移除末尾的零
    result = result.replace(/零+$/, '')
    //将【零一十】换成【零十】
    //result = result.replace(/零一十/g, '零十');//貌似正规读法是零一十
    //将【一十】换成【十】
    result = result.replace(/^一十/g, '十');
    return result;
}
//洗牌
let arr = [
    {id:1},
    {id:2},
    {id:3},
    {id:4},
    {id:5},
    {id:6},
]
arr.sort((a,b) =>{
    return Math.random() - 0.5
})
console.log(arr);
//中文排序
var arr = ['南京', '北京', '上海', '杭州', '深圳'];
function sortChinese (arr) { // 参数: 排序的数组
arr.sort(function (item1, item2) {
return item1.localeCompare(item2, 'zh-CN');
})
}
sortChinese(arr)
console.log(arr); // ["北京", "杭州", "南京", "上海", "深圳"]
//标签全屏
element.requestFullscreen();
document.exitFullscreen();
//标签不可点击css
pointer-events: none;

数据格式互转:www.cnblogs.com/ajaemp/p/12…

获取媒体流

function getMedia1(video) {
    navigator.mediaDevices.getUserMedia({
        video: {
            width: 1366,
            height: 766,
        },
    }).then(strem => {
        video.srcObject = strem;
        video.play()
    })
}
function getMedia2(video) {
    navigator.mediaDevices.getDisplayMedia({
        audio:true,
        video: {
            width: 1366,
            height: 766,
        },
    }).then(strem => {
        video.srcObject = strem;
        console.log(strem.getAudioTracks())
        video.play()
    })
}
let video = document.querySelector('video');
//getMedia1(video);
getMedia2(video);