process.stdin的end事件如何触发

 百度发现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());
});

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值