百度发现csdn那篇文章还需要付费,你说你付费就算了,你特么抄人家简书上面的一模一样说是原创然后设置付费,都想骂人。
我自己看javaScript权威指南第一章有一个案例要运行,发现一直运行不起来,去百度查找如何结束process.stdin,最后贴出了案例代码。
我自己总结就是使用 process.stdin.on("readable", () => {});监听用户输入,然后根据用户输入标识来调用process.stdin.emit("end")来结束键盘输入,所以这个如何结束就完全可以自定义了。下面代码是判断如果用户输入换行符那代表就结束,然后执行相关的代码。
const precess = require("process");
class DefaultMap extends Map {
constructor(defaultValue) {
super(); //调用超类构造器
this.defaultValue = defaultValue; // 记住默认值
}
get(key) {
if (this.has(key)) {
return super.get(key);
} else {
return this.defaultValue;
}
}
}
//这个类计算并显示字母的频率柱形图
class Histogram {
constructor() {
this.letterCounts = new DefaultMap(0); // 字母到数量的映射
this.totalLetters = 0; //字母总数
}
//这个函数用文本中的字母更新柱形图
add(text) {
//移除文本中的空白,然后将字母转换为大写
text = text.trim().toUpperCase();
//接着循环文本中的字符
for (let character of text) {
let count = this.letterCounts.get(character); // 取得之前的数量
this.letterCounts.set(character, count + 1); // 递增
this.totalLetters++;
}
}
//将柱形图转换为字符串并显示ASCII图形
toString() {
//把映射转换为一个[key,value]数组的数组
let entries = [...this.letterCounts];
//按数量和字母表对数组排序
entries.sort((a, b) => {
//这个函数定义排序的方式
if (a[1] == b[1]) {
//如果数量相同
return a[0] < b[0] ? -1 : 1; // 按字母表排序
} else {
//如果数量不同
return b[1] - a[1]; //数量大的排前面
}
});
//把数量转换为百分比
for (let entry of entries) {
entry[1] = (entry[1] / this.totalLetters) * 100;
}
//删除小于1%的条目
entries = entries.filter((entry) => entry[1] >= 1);
//接着把每个条目转换为一行文本
let lines = entries.map(
([l, n]) => `${l}: ${"#".repeat(Math.round(n))} ${n.toFixed(2)}%`
);
//返回把所有行拼接起来的结果,以换行符分隔
return lines.join("\n");
}
}
//这个async (返回期约的)函数创建一个Histogram对象
//从标准输入异步读取文本块.然后把这些块添加到柱形图
//在读取到流末尾后,返回柱形图
async function histogranFromStdin() {
precess.stdin.setEncoding("utf-8"); //读取 Unicode 字符串,而非字节
process.stdin.on("readable", () => {
let chunk = process.stdin.read();
let isEnd;
if (typeof chunk === "string") {
isEnd = chunk.slice(0, -2);
}
if (isEnd === "") {
process.stdin.emit("end");
return;
}
histogram.add(chunk);
});
let histogram = new Histogram();
for await (let chunk of process.stdin) {
histogram.add(chunk);
}
return histogram;
}
//最后这行代码是这个程序的主体
//它基于标准输入创建一个Histogram对象,然后打印柱形图
histogranFromStdin().then((histogram) => {
console.log(histogram.toString());
});