javaScript蓝桥杯---JSON 生成器

news2025/1/15 17:31:21

目录

  • 一、介绍
  • 二、准备
  • 三、目标
  • 四、代码
  • 五、完成


一、介绍

JSON 已经是大家必须掌握的知识点,JSON 数据格式为前后端通信带来了很大的便利。在开发中,前端开发工程师可以借助于 JSON 生成器快速构建一个 JSON 用来模拟数据。

本题请你开发一个简易的 JSON 生成器工具,使它能根据模板生成对应格式的 JSON 。

二、准备

开始答题前,需要先打开本题的项目代码文件夹,目录结构如下:

├── css
├── index.html
└── js
    ├── highlight.min.js
    └── index.js

其中:

  • css 是样式文件夹。
  • index.html 是主页面。
  • js/highlight.min.js 是 json 格式化文件。
  • js/index.js 是需要补充代码的 js 文件。

在浏览器中预览 index.html 页面效果如下:
在这里插入图片描述

三、目标

请在 index.js 文件中补全 generateData 函数代码,并最终返回一个 js 对象(说明 : generateData 生成的数据会由插件自动转化成 JSON)。

在左侧的输入框中输入指定格式的数据模板,点击生成 JSON 按钮,右侧会自动生成对应格式的 JSON 数据。

  1. 数据模板中对象的 key 对应的 value 如果是 {{}} 并且符合下述规则,则根据下述规则解析,否则一律返回原始 value 值。具体规则如下:
    • {{bool()}} 表示随机生成布尔值。
    • {{integer(n, m)}} 表示生成 n-m 之间(包含 n、m )的随机整数(注意:n<m)。
    • 在这里插入图片描述
      附目标 1 测试用例:
{
  isPass: '{{bool()}}',
  age: '{{integer(3, 5)}}',
  goodsNumber:2,
  isShow:false,
  tag:'phone',
  fn:'{{integer}}'
}
  1. 数据模板中 {{repeat()}}(此项只会出现在数组首位)表示重复生成数组中的数据,如:“repeat(5, 7)” 则表示随机生成 5-7 条数组数据,repeat 中值只包含一个数字,如"repeat(5)" 表示生成 5 条数组数据。
    在这里插入图片描述
    附目标 2 测试用例(3 组):
// (1)随机生成 `2-5` 条数组数据
[
  "{{repeat(2, 5)}}",
  {
    isActive: "{{bool()}}",
    age: "{{integer(20, 40)}}",
    num: 2,
    boolean: true,
    str: "str",
    isTel: "{{bool}}",
    fn: "{{fn()}}",
  },
]
// (2)固定生成 `7` 条数组数据
[
  ("{{repeat(7)}}",
  {
    isTrue: "{{bool()}}",
    score: "{{integer(3, 7)}}",
    tag: "android",
    isSamll: true,
    fn: "{{fn()}}",
  })
]
// (3)无 repeat 的情况
[
  { maxNum: 10 }
];

注意:本题不考虑用户输入和传参不合法的情况,只处理合法的数据格式即可,实际测试中 key 和 value 为非固定值。提供的测试用例仅为方便测试代码使用,实际使用中需要对所有符合要求的数组/对象结构的模板生效。

四、代码

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>JSON 生成器</title>
    <link rel="stylesheet" href="./css/default.min.css" />
    <script src="./js/highlight.min.js"></script>
    <script>
      hljs.highlightAll();
    </script>
  </head>

  <body>
    <div class="btnbox" id="btnbox">
      <button class="btn" onclick="generate()">生成json</button>
    </div>
    <div class="con">
      <div class="left">
        <textarea id="myTextarea" name="myTextarea"> </textarea>
      </div>
      <div>
        <pre>
            <code id="code " class="language-js "></code>
            </pre>
      </div>
    </div>
    <script>
      let myTextarea = document.getElementById("myTextarea");
      myTextarea.innerHTML = `[
  '{{repeat(2, 3)}}',
  {
    isActive: '{{bool()}}',
    age: '{{integer(20, 40)}}',
    num:2,
    boolean:true,
    str:'str',
    isTel:'{{bool}}',
    fn:'{{fn()}}'
   }
]`;
      let code = document.getElementById("code ");
      let lastData;
      // 点击生成按钮生成对应的 JSON
      function generate() {
        let str = myTextarea.value.replace(/\s*/g, "");
        var jsonData = new Function("return" + str)();
        lastData = generateData(jsonData);
        let jsonCode = JSON.stringify(lastData, null, 2); // 设置 tab 为两个空格
        code.innerHTML = jsonCode;
        hljs.highlightAll();
      }
    </script>
    <script src="./js/index.js "></script>
  </body>
</html>

js/index.js

/*
 * @param {*}  左侧输入框输入的值转化成的 js 数据
 * @return {*} 根据传入的数据生成对应的 js 格式数据
 */
let generateData = (data) => {
  // TODO:待补充代码
};

module.exports = { generateData };

css/default.min.css

/*!
  Theme: Default
  Description: Original highlight.js style
  Author: (c) Ivan Sagalaev <maniac@softwaremaniacs.org>
  Maintainer: @highlightjs/core-team
  Website: https://highlightjs.org/
  License: see project LICENSE
  Touched: 2021
*/

* {
  margin: 0;
  padding: 0;
}

.con {
  display: flex;
  width: 90%;
  margin: 0 auto;
  justify-content: space-between;
}

.con div {
  width: 48%;
}

.btnbox {
  width: 100%;
  text-align: center;
}

.btn {
  display: inline-block;
}

.left {
  margin-top: 20px;
}

pre code.hljs {
  display: block;
  overflow-x: auto;
  padding: 1em;
}

code.hljs {
  padding: 3px 5px;
}

.hljs {
  background: #f3f3f3;
  color: #444;
}

.hljs-comment {
  color: #697070;
}

.hljs-punctuation,
.hljs-tag {
  color: #444a;
}

.hljs-tag .hljs-attr,
.hljs-tag .hljs-name {
  color: #444;
}

.hljs-attribute,
.hljs-doctag,
.hljs-keyword,
.hljs-meta .hljs-keyword,
.hljs-name,
.hljs-selector-tag {
  font-weight: 700;
}

.hljs-deletion,
.hljs-number,
.hljs-quote,
.hljs-selector-class,
.hljs-selector-id,
.hljs-string,
.hljs-template-tag,
.hljs-type {
  color: #800;
}

.hljs-section,
.hljs-title {
  color: #800;
  font-weight: 700;
}

.hljs-link,
.hljs-operator,
.hljs-regexp,
.hljs-selector-attr,
.hljs-selector-pseudo,
.hljs-symbol,
.hljs-template-variable,
.hljs-variable {
  color: #ab5656;
}

.hljs-literal {
  color: #695;
}

.hljs-addition,
.hljs-built_in,
.hljs-bullet,
.hljs-code {
  color: #397300;
}

.hljs-meta {
  color: #1f7199;
}

.hljs-meta .hljs-string {
  color: #38a;
}

.hljs-emphasis {
  font-style: italic;
}

.hljs-strong {
  font-weight: 700;
}

.btn,
.btn-all {
  margin-top: 10px;
  display: inline-block;
  color: #0099cc;
  background: #2e7eee;
  border-radius: 10px;
  text-decoration: none;
  text-transform: uppercase;
  border: none;
  color: white;
  padding: 8px 16px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 16px;
  transition-duration: 0.4s;
  cursor: pointer;
}

#myTextarea {
  width: 100%;
  height: 500px;
}

五、完成

index.js

// 定义正则
let reg = /^\{\{(.+)\}\}$/; // 匹配{{..}}
let repeatReg = /^\{\{repeat\(\d+(,\d+)?\)\}\}$/; // 匹配{{repeat(n)}}和{{repeat(n,m)}}
let boolReg = /^\{\{bool\(\)\}\}$/; // 匹配{{bool()}}
let integerReg = /^\{\{integer\(\d+,\d+\)\}\}$/; // 匹配{{integer(n,m)}}

let objReg = [boolReg, integerReg]; // 对象里会用到的所有正则

// 判断value是否符合objReg中的规则
function isConformObjReg(value) {
  return objReg.find((r) => r.test(value));
}

// 随机生成布尔值的函数
function bool() {
  return Math.random() < 0.5 ? true : false;
}
// 生成n到m之间的随机整数(包含n和m)
function integer(n, m) {
  return Math.floor(Math.random() * (m - n + 1) + n);
}
// 获得需要重复的次数,次数在n到m之间,没传递m时次数为n
function repeat(n, m) {
  if (!m) return n;
  return integer(n, m);
}
/*
 * @param {*}  左侧输入框输入的值转化成的 js 数据
 * @return {*} 根据传入的数据生成对应的 js 格式数据
 */
let generateData = (data) => {
  // TODO:待补充代码
  if (typeof data !== "object") {
    // 如果data是基础数据类型,不做处理
    return data;
  }

  // 到这里说明data一定是object类型的
  let result; // 存放结果

  if (Array.isArray(data)) {
    // 如果data是数组
    result = [];
    if (repeatReg.test(data[0])) {
      // 数组第一项是{{repeat(...)}}
      // 获得需要重复的次数
      const nums = eval(reg.exec(data[0])[1]);
      for (let i = 0; i < nums; i++) {
        // 以数组第二项为基准生成数据,递归调用generateData
        result[i] = generateData(data[1]);
      }
    } else {
      // 数组第一项不是{{repeat(...)}},则直接遍历数据对数组每一项进行generateData处理
      for (let i = 0; i < data.length; i++) {
        result[i] = generateData(data[i]);
      }
    }
  } else {
    // 如果data不是数组那就是对象
    result = {};
    for (const key in data) {
      const value = data[key];
      if (isConformObjReg(value)) {
        // 属性值是{{bool()}}或{{integer(...)}}
        // 获得{{和}}之间的匹配的结果,如:"bool()"或"integer(...)""
        const fnStr = reg.exec(value)[1];
        // 用eval将fnStr字符串当作js代码来运行,如果fnStr为"bool()"则 eval(fnStr)代表运行bool函数
        result[key] = eval(fnStr);
      } else if (typeof value === "object") {
        // 属性值不符合对象允许的正则规则并且属性值是object类型,则递归调用generateData
        result[key] = generateData(value);
      } else {
        // 属性值不符合对象允许的正则规则并且属性值不是object类型,则属性值是基础数据类型,不做处理
        result[key] = value;
      }
    }
  }

  return result;
};
module.exports = { generateData };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python快速安装库

Python快速安装库 Python作为一种功能强大且易于学习的编程语言&#xff0c;已经成为许多开发人员的首选。在Python中&#xff0c;库是重要的一部分&#xff0c;它们提供了各种功能和工具来简化开发过程。安装这些库的过程可能会比较繁琐&#xff0c;但我们可以通过一些简单的…

PHP的学习--Traits新特性

自 PHP 5.4.0 起&#xff0c;PHP 实现了代码复用的一个方法&#xff0c;称为 traits。 Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制&#xff0c;使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的…

博客系统测试用例设计之自动化测试

测试用例设计之自动化测试 &#x1f337; 一 测试用例设计&#x1f33a; 1 功能测试&#x1f338; &#xff08;1&#xff09;登录功能&#x1f338; &#xff08;2&#xff09;列表页功能&#x1f338; &#xff08;3&#xff09;编辑博客功能&#x1f338; &#xff08;4&…

大厂设计师都在用的9个灵感工具

每一件伟大的设计作品都离不开设计师灵感的爆发。设计师有很多灵感来源&#xff0c;比如精美的摄影图片、酷炫的网站设计、APP的特色功能、友好的用户体验动画&#xff0c;或者一篇文章。 设计师每天都需要收集灵感&#xff0c;把灵感收集当成日常生活。在这篇文章中&#xff…

自动化测试工具比较:Selenium vs. Cypress

简介 Selenium是一个广泛应用的测试自动化工具&#xff0c;支持多种编程语言和浏览器。它使用WebDriver协议与浏览器进行通信&#xff0c;可以模拟用户在浏览器中的交互行为。Cypress是一个相对较新的测试自动化工具&#xff0c;它专注于现代Web应用程序的测试&#xff0c;并提…

LarkXR知识库 | 开发者社区FAQ合集(二)

LarkXR是一套基于GPU云化、图形容器、音视频实时编解码、网络传输优化等核心技术的通用型实时云渲染解决方案&#xff0c;帮助XR领域企业级用户及开发者快速搭建XR应用上云通道&#xff0c;使其在各类智能终端上流畅的运行、使用及传播。 平行云开发者社区上线以来&#xff0c…

Git基本知识

Git基本知识 1、Git 资料参考 Git 官网&#xff1a;https://book.git-scm.com/ Git 完整命令手册地址&#xff1a;http://git-scm.com/docs Git 中文文档&#xff1a;https://git-scm.com/book/zh/v2 2、Git安装 Git 各平台安装包下载地址为&#xff1a; http://git-scm…

F407标准库之定时器触发AD转换

关于ADC转换&#xff0c;正点原子的标准库开发中讲的是&#xff1a;软件触发一次转换&#xff0c;然后获取一个数据&#xff0c;没提及外部触发&#xff0c;也没提及ADC中断。 如果要多次读取数据&#xff0c;可以通过循环延时来实现。 这种情况就是通过多次调用&#xff0c;轮…

中国电子学会2023年05月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

2023-05 Scratch三级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 关于变量&#xff0c;下列描述错误的是&#xff1f;&#xff08;A &#xff09;&#xff08;2分&#xff09; A.只能建一个变量 …

【CANoe】CAPL如何检测周期性报文

文章目录 一、实例1、新建工程2、增加两个 Module3、选择在线模式(Online Mode)仿真总线(Simulated Bus)4、配置CAPL Test Moduletest.can代码如下&#xff1a; 5、配置CAN IG(发送周期报文0x101)6、测试结果 二、核心代码三、CAPL函数详解截图参考&#xff1a; 一、实例 以下…

浅谈这些年如何被MDK, IAR, GCC和厂家SDK版本兼容性“蹂躏”, 一代版本一代坑

原创文章&#xff0c;转载请注明出处&#xff1a;https://www.armbbs.cn/forum.php?modviewthread&tid119562 版本迭代是嵌入式开发永久的痛&#xff0c;这么多年不知道浪费了多少时间在版本迭代上。 部分系统组件还好点&#xff0c;有个LTS长期支持版&#xff0c;而厂家…

侧信道攻击:SPA / DPA

参考资料&#xff1a;Cryptographic Engineering, by Cetin Kaya Ko, Editor Springer. 文章目录 Side-Channel AnalysisTiming AnalysisSample Power AnalysisDifferential Power Analysis其他攻击 对抗方法 Side-Channel Analysis 对于密码算法的攻击手段&#xff0c;往往是…

【LoRaWAN】单播与组播multicast调试记录

本文主要记录 【LoRaWAN】单播与组播multicast调试过程的问题 2023.06.09 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;[欢迎访问我的 Ethernet_Comm 博客…

甘孜州文化旅游产品市场营销策略研究_kaic

甘孜州文化旅游产品市场营销策略研究 摘要&#xff1a; 近年来&#xff0c;随着文化旅游的兴起&#xff0c;越来越多的旅游者渴望精神层面的满足&#xff0c;获得新奇的文化体验&#xff0c;而我国文化旅游仍处于单层次的观赏旅游。本文研究背景包括对旅游行业的背景介绍&#…

【HTML】form标签

<form> 标签用于创建 HTML 表单&#xff0c;它是用于收集用户输入的重要元素。表单可以包含各种输入字段、按钮和其他交互元素&#xff0c;用于向服务器发送用户输入数据。 下面是一个简单的 <form> 标签的示例&#xff1a; <form action"/submit-form&q…

Spring高级装配--条件化的bean

目录 条件化创建bean的例子 使用 解析 条件化创建bean的例子 希望一个或多个bean只有在应用的类路径下包含特定的库时创建希望某个bean只有当另外某个特定的bean也声明之后才会创建要求某个特定的环境变量设置之后&#xff0c;才会创建某个bean在Spring 4之前&#xff0c;很…

【乐观锁与悲观锁】—— 每天一点小知识

&#x1f4a7; 乐观锁与悲观锁 \color{#FF1493}{乐观锁与悲观锁} 乐观锁与悲观锁&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&…

2023-06-09:什么是Redis事务?原理是什么?

2023-06-09&#xff1a;什么是Redis事务&#xff1f;原理是什么&#xff1f; 答案2023-06-09&#xff1a; Redis中的事务是以一组命令的形式出现的&#xff0c;这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令&#xff0c;而且所有命令…

linuxOPS基础_linux ACL访问控制

问题&#xff1a;我们学过的所有者身份包含哪些&#xff1f; 答案:ugo,属主&#xff0c;属组&#xff0c;其他。 问题&#xff1a;我们学过的文件权限包含哪些&#xff1f; 答案&#xff1a;rwx&#xff0c;读写执行&#xff0c;特殊s,t ​ ACL&#xff0c;是 Access Contro…

java变量

基本数据类型介绍 基本的数据类型: 整数类型&#xff1a;byte、short、int、long 定义long类型的变量&#xff0c;赋值时需要以"l"或"L"作为后缀。 Java程序中变量通常声明为int型&#xff0c;除非不足以表示较大的数&#xff0c;才使用long。 Java的整…