仿掘金官网(一)| 青训营笔记

105 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第7天。

以下是在写仿掘金官网NodeJS服务器的时候遇到的一些问题还有相关的解决方案。

随机数的截取公式

如果我们想要获得一个(a,b)范围的随机数,那我们可以使用以下代码来获取:

let rand=Math.random*(b-a)+a;

因为Math.random给出的随机数为(0,1),例如:我们想要获得一个(25,625)范围的随机数就可以使用以上代码进行代换。

let rand=Math.random*(625-25)+25;

这样,我们就可以得出指定范围的随机数了

关于在遍历的过程中使用同一个对象等引用数据类型会导致的问题

说实话,这个问题的确有点痛心疾首了。

在写服务器的过程中,我想通过遍历将收集来的md文件中的内容变成字符串存放在json文件中,使用data222这个数组作为中间值,但是,当我运行程序后,data222中的每一个元素都是相同的,这就很难受了,最后才发现是对象指向的问题

我们来看如下代码:

let data222 = [];
let article = {
    author: "掘金",
	name: "",
    essay: "",
    category: "",
    goodtext: "",
    time: "",
    browse: 0,
    like: 0,
    comments: 0,
    collect: 0
}
fs.readdir(process.cwd() + '/biji/', (err, files) => {
    console.log(process.cwd() + '/biji/');
    for (let i = 0; i < files.length; i++) {
        fs.readFile(process.cwd() + '/biji/' + files[i], (err, data) => {
            if (err) {
                throw err;
            } else {
                //作者名字
                //文章数据:data
                let essay = data.toString();
                article.essay = essay;
                //文章名字
                let item1 = files[i].split(".");
                let name = item1[0];
                article.name = name;

                //分类标签
                let category = '';
                article.category = category;

                //文章优选内容截取
                let origintext = data.toString();
                let goodtext = origintext.replace(/[#*`]/g, '').replace(/[^a-z''! 。,.0-9\u4e00-\u9fa5A-Z]/g, '').substring(0, 200);
                article.goodtext = goodtext;
                //时间
                let time = Math.floor(Math.random() * (2170 - 5) + 5);
                let time1 = "";
                //判断时间给出具体时间数据
                if (time >= 0 && time < 24) {
                    if (time = 0) {
                        time1 = 1 + "小时前";
                    } else {
                        time1 = time + "小时前";
                    }
                } else if (time > 24 && time < 720) {
                    time1 = Math.floor(time / 24) + "天前";
                } else if (time >= 720) {
                    time1 = Math.floor(time / 720) + "月前";
                }
                article.time = time1;
                //给出随机浏览数
                let browse = Math.floor(Math.random() * (3000 - 186) + 186);
                article.browse = browse;
                //给出随机点赞数
                let like = Math.floor(Math.random() * 50);
                article.like = like;
                //评论:0
                let comments = 0;
                article.comments = comments;
                //收藏:0
                let collect = 0;
                article.collect = collect;
                console.log(article.browse);
                let index = data222.length;
                data222[index] = article;
            }
        })
    }
})

以及另外一个代码片段:

let data222 = [];

fs.readdir(process.cwd() + '/biji/', (err, files) => {
    console.log(process.cwd() + '/biji/');
    for (let i = 0; i < files.length; i++) {
        fs.readFile(process.cwd() + '/biji/' + files[i], (err, data) => {
            let article = {
                author: "掘金",
                name: "",
                essay: "",
                category: "",
                goodtext: "",
                time: "",
                browse: 0,
                like: 0,
                comments: 0,
                collect: 0
            }
            if (err) {
                throw err;
            } else {
                ...
                //与上面代码相同
            }
        })
    }
})

两段代码唯一的不同就是,将article对象由全局对象转化成了局部对象,这也意味着程序每遍历一次就会创建新的对象,每个对象的地址都是不同的,但是,当我们将遍历所有的对象都指向article的全局变量,这就会导致一些问题的发生,比如,所有数组中的元素都相同等等。