Node.js 艺术:用代码打印出绚丽多彩的控制台柱状图

简介: Node.js 艺术:用代码打印出绚丽多彩的控制台柱状图

说在前面

echarts图表我们见多了,有没有想过在控制台实现一个图标呢?本文将带您领略 Node.js 的魅力,教您如何使用 JavaScript 代码在控制台中一键绘制出令人惊叹的柱状图。我们将一起揭示背后的技巧,包括数据处理、格式化输出和绘图算法,让您轻松将数据转化为视觉艺术,并且为您的控制台应用增添一份独特的魅力。

效果展示

实现步骤

1、获取最大公约数

获取数据集合的最大公约数,并将数据集合中的每个元素都除以这个最大公约数,使得所有数据可以被放缩到一个较小的范围内。

function gcd(a, b) {
  if (b === 0) {
    return a;
  }
  return gcd(b, a % b);
}
function findGCD(numbers) {
  if (numbers.length === 0) {
    return null;
  }
  let result = numbers[0];
  for (let i = 1; i < numbers.length; i++) {
    result = gcd(result, numbers[i]);
    if (result === 1) {
      return 1;
    }
  }
  return result;
}

2、格式化数值

将每个数字格式化为固定位数的字符串,并居中对齐

function getShowNum(num, barWidth) {
  const numLen = (num + "").length;
  const dif = barWidth - numLen;
  const left = Math.floor(dif / 2);
  return " ".repeat(left) + num + " ".repeat(dif - left);
}

3、数据化简

将柱形图数据化简,所有数据除以他们的最大公约数,通过设置的maxHeight计算柱状图条形的高度缩放比例 scaleFactor。

let data = options.data;
  const { maxHeight, barSpacing = 2 } = options;
  const result = findGCD(data);
  data = data.map((item) => {
    return item / result;
  });
  const max = Math.max(...data);
  const barWidth = (max * result + "").length;
  const min = Math.min(...data);
  const scaleFactor = maxHeight / (max - min);

4、绘制柱状图

从 maxHeight 开始循环,逐行输出柱状图。对于每一行,先初始化 row 为一个竖线符号“|”和一个绿色 ANSI 转义码,用于表示柱状图条形的颜色。然后遍历数据集合中的每个元素,根据其大小和 scaleFactor 的结果,输出相应数量的空格或实心方块字符。

开头输出一个 | 作为y轴,最下方输出一行 作为x轴。

let maxLen = 0;
  for (let i = maxHeight + 3; i > 0; i--) {
    let row = "|   \x1B[32m";
    data.forEach((value) => {
      const scaledValue = Math.floor(value * scaleFactor);
      if (scaledValue === i) row += getShowNum(value * result, barWidth);
      else if (scaledValue >= i) {
        for (let j = 0; j < barWidth; j++) {
          row += "█";
        }
      } else {
        for (let j = 0; j < barWidth; j++) {
          row += " ";
        }
      }
      for (let j = 0; j < barSpacing; j++) {
        row += " ";
      }
    });
    maxLen = Math.max(maxLen, row.length);
    console.log(row + "\x1B[39m");
  }
  console.log(" ̄".repeat((maxLen / 3) * 2));

5、完整代码

const { findGCD } = require("../utils");
function getShowNum(num, barWidth) {
  const numLen = (num + "").length;
  const dif = barWidth - numLen;
  const left = Math.floor(dif / 2);
  return " ".repeat(left) + num + " ".repeat(dif - left);
}
function printBarChart(options) {
  let data = options.data;
  const { maxHeight, barSpacing = 2 } = options;
  const result = findGCD(data);
  data = data.map((item) => {
    return item / result;
  });
  const max = Math.max(...data);
  const barWidth = (max * result + "").length;
  const min = Math.min(...data);
  const scaleFactor = maxHeight / (max - min);
  let maxLen = 0;
  for (let i = maxHeight + 3; i > 0; i--) {
    let row = "|   \x1B[32m";
    data.forEach((value) => {
      const scaledValue = Math.floor(value * scaleFactor);
      if (scaledValue === i) row += getShowNum(value * result, barWidth);
      else if (scaledValue >= i) {
        for (let j = 0; j < barWidth; j++) {
          row += "█";
        }
      } else {
        for (let j = 0; j < barWidth; j++) {
          row += " ";
        }
      }
      for (let j = 0; j < barSpacing; j++) {
        row += " ";
      }
    });
    maxLen = Math.max(maxLen, row.length);
    console.log(row + "\x1B[39m");
  }
  console.log(" ̄".repeat((maxLen / 3) * 2));
}
// 使用示例
const options = {
  data: [3, 7, 2, 5, 8, 12],
  maxHeight: 10,
  barWidth: 2,
  barSpacing: 1,
};
printBarChart(options);

后续

目前只实现了一个简单的雏形样板,后续会考虑完善更多的功能和样式,并封装成一个插件,有兴趣的同学们可以提点建议和想法。

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
2月前
|
JavaScript
短小精悍的js代码
【10月更文挑战第17天】
130 58
|
2月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 来检查代码规范并自动格式化 Vue.js 代码。
【10月更文挑战第7天】随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 来检查代码规范并自动格式化 Vue.js 代码。通过安装和配置这两个工具,可以确保代码风格一致,提升团队协作效率和代码质量。
271 2
|
2月前
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
47 0
|
20天前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
53 15
在 golang 中执行 javascript 代码的方案详解
|
1月前
|
JavaScript
原生js炫酷随机抽奖中奖效果代码
原生js随机抽奖是一个炫酷的根据数据随机抽奖的代码,该网页可进行随机抽取一个数据,页面动画高科技、炫酷感觉的随机抽奖效果,简单好用,欢迎下载!
46 3
|
1月前
|
JavaScript C++ 容器
【Azure Bot Service】部署NodeJS ChatBot代码到App Service中无法自动启动
2024-11-12T12:22:40.366223350Z Error: Cannot find module 'dotenv' 2024-11-12T12:40:12.538120729Z Error: Cannot find module 'restify' 2024-11-12T12:48:13.348529900Z Error: Cannot find module 'lodash'
43 11
|
2月前
|
XML JavaScript 前端开发
JavaScript控制台:提升Web开发技能的秘密武器
作为Web开发人员,掌握JavaScript控制台中的各种方法至关重要。本文介绍了22种实用的console方法,从基本的log()到高级的profile()和memory,每种方法都配有示例和说明,帮助开发者更高效地调试和记录信息。通过了解这些工具,您可以优化代码、提高开发速度,减少错误,使编码过程更加顺畅愉快。
45 1
JavaScript控制台:提升Web开发技能的秘密武器
|
24天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
1月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
475 4