当前位置: 首页 > news >正文

JS通过ASCII码值实现随机字符串的生成(可指定长度以及解决首位不出现数值)

        在之前写过一篇“JS实现随机生成字符串(可指定长度)”,当时写的过于简单和传统,比较粗放。此次针对此问题,对随机生成字符串的功能进行优化处理,对随机取到的字符都通过程序自动来完成。

        在写之前,我们先了解下String.charCodeAt、Array.from()、String.fromCharCode等方法,以及随机获取指定范围中的值,这些在此次功能优化中起到关键作用。

一、String.charCodeAt

        获取指定下标的字符的ASCII码(Unicode)。

返回值:0~65535之间的整数

语法:

string.charCodeAt(index)

参数:index:指定字符的下标

        示例:

console.log('a'.charCodeAt(0))
console.log('z'.charCodeAt(0))
console.log('A'.charCodeAt(0))
console.log('Z'.charCodeAt(0))// 运行结果:
97
122
65
90

        通过上述输出,得出结论是a~z的ASCII码为97~122,A~Z的ASCII码为65~90。

 

二、Array.from

        Array.from() 方法从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。

语法:

Array.from(arrayLike[, mapFn[, thisArg]])

        这里通过Array.from生成一个1~10的数值元素的数组。示例如下:

console.log(Array.from({length: 10}, (_, index) => index + 1))// 运行结果:
[1, 2, 3, 4,  5,6, 7, 8, 9, 10
]

 

三、String.fromCharCode

        该函数属于String对象,所有主流浏览器均支持该函数。

语法:

String.fromCharCode( [code1 [, code2 [, codes... ]]] )

        String.fromCharCode()函数属于静态函数,而且只能够通过全局String对象进行调用,不能通过String对象的实例进行调用。

        接下来我们将通过String.fromCharCode,并结合Array.from方法,将97~122,65~90转换为字母。示例如下:

// 生成小写字母的ASCII码
const codesLower = Array.from({length: 26}, (_, index) => 65 + index)
// 生成大写字母的ASCII码
const codesCapital = Array.from({length: 26}, (_, index) => 97 + index)
// 输出小写ASCII码
console.log(codesLower)
// 输出大写ASCC码
console.log(codesCapital)
// 转换为小写字母
console.log(String.fromCharCode(...codesLower))
// 转换为大写字母
console.log(String.fromCharCode(...codesCapital))// 运行结果:
[65, 66, 67, 68, 69, 70, 71, 72,73, 74, 75, 76, 77, 78, 79, 80,81, 82, 83, 84, 85, 86, 87, 88,89, 90
]
[97,  98,  99, 100, 101, 102,103, 104, 105, 106, 107, 108,109, 110, 111, 112, 113, 114,115, 116, 117, 118, 119, 120,121, 122
]
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz

        如上所示,我们可以通过获取随机的ASCII码值,来生成随机字符串(包含字母+数值)。

 

四、随机获取指定范围的值

        要想随机获取指定范围的值,我们需要先定义一个函数,用于随机获取0~9,65~90,97~122之间的值。示例代码如下:

// 随机值
const randomCode = (min, max) => Math.floor(Math.random() * (max - min)) + minconsole.log(randomCode(0, 10))// 运行结果:
1

        由于使用的是Math.floor为向下取值,所以0~10获取到的值范围为 0<= x < 10,所以最大值是10,而不是9。如果写0~9则无法取到9的值。

 

五、生成ASCII码序列值

        我们先使用Array.from将0~9, 65~90, 97~122的ASCII码值生成出来。示例如下:

// 生成序列值
const generatorSequence = (_len, _start) => Array.from({length: _len}, (_, index) => _start + index)
// 生成ASCII码
const ASCCodes= [...generatorSequence(10, 0),...generatorSequence(26, 65),...generatorSequence(26, 97)
]console.log(ASCCodes)// 运行结果:
[0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  65,  66,67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108,109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,121, 122
]

六、生成随机字符串

        接下来通过随机取值函数randomIndex()方法,生成ASCCodes数组的索引值,取出对应索引的值。示例如下:

// 生成序列值
const generatorSequence = (_len, _start) => Array.from({length: _len}, (_, index) => _start + index)
// 生成ASCII码
const ASCCodes = [...generatorSequence(10, 0),...generatorSequence(26, 65),...generatorSequence(26, 97)
]
// 随机值
const randomIndex = (min, max) => Math.floor(Math.random() * (max - min)) + min
// 定义获取随机字符 函数
const getRandomStr = () => {const value = ASCCodes[randomIndex(0, ASCCodes.length)]return value > 9 ? String.fromCharCode(value) : value
}
// 定义 生成随机值 函数
const generatorRandomStr = (_len) => {return Array.from({length: _len}, (_, index) => {return getRandomStr()}).join('')
}
// console.log(ASCCodes)
console.log(generatorRandomStr(50))// 运行结果:
9MBz2VGbpTFE4M3V8TeswAWdTEliwvgGhODQQFjaiLE2Hr0DGC

七、处理首位数值问题

        如上述结果可见,字符串首位可能会出现数值情况。希望首位不会出现数值,在生成时可作简单调整即可。示例如下:

// 生成序列值
const generatorSequence = (_len, _start) => Array.from({length: _len}, (_, index) => _start + index)
// 生成ASCII码
const ASCCodes = [...generatorSequence(10, 0),...generatorSequence(26, 65),...generatorSequence(26, 97)
]
// 随机值
const randomIndex = (min, max) => Math.floor(Math.random() * (max - min)) + min
// 定义获取随机字符 函数
const getRandomStr = (index) => {const value = ASCCodes[randomIndex(0, ASCCodes.length)]// 如果为首位,并且取到的值小于等于9,则为数字,重新获取if (index === 0 && value <= 9) return getRandomStr(index)return value > 9 ? String.fromCharCode(value) : value
}
// 定义 随机生成字符串
const generatorRandomStr = (_len) => {return Array.from({length: _len}, (_, index) => {return getRandomStr(index)}).join('')
}
// console.log(ASCCodes)
console.log(generatorRandomStr(50))// 运行结果:
BqpwIAvYHpKjvbfsgxfk4YVNzpkFRoK3CYOIWq2IGfDcjazuUF

        此篇就先讲到这,希望对大家有所帮助~

 

 

 

http://www.lryc.cn/news/524702.html

相关文章:

  • 速通Docker === 快速部署Redis主从集群
  • 论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(一)
  • stm32使用MDK5.35时遇到*** TOOLS.INI: TOOLCHAIN NOT INSTALLED
  • 在Ubuntu上安装RabbitMQ教程
  • 【算法】集合List和队列
  • uniapps使用HTML5的io模块拷贝文件目录
  • css‘s hover VS mobile
  • 工业制造离不开的BOM
  • HTML中的`<!DOCTYPE html>`是什么意思?
  • C语言之斗地主游戏
  • 【玩转全栈】----Django制作部门管理页面
  • Unreal Engine 5 C++ Advanced Action RPG 十章笔记
  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证9)
  • 缓存之美:万文详解 Caffeine 实现原理(上)
  • Spark/Kafka
  • 深入浅出:Go语言中的Unicode与字符编码详解
  • 什么是SSL及SSL的工作流程
  • .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
  • AD7606, 逐次逼近型ADC以及一次被GPT坑了的过程.
  • 抬手、放手识别算法
  • 深度学习篇---AnacondaLabelImg
  • 探索云原生可观测性:技术与团队协作的深度结合
  • 解决 Django 5.1 中的 TemplateSyntaxError 错误
  • 基于SSM的自助购药小程序设计与实现(LW+源码+讲解)
  • 04JavaWeb——Maven-SpringBootWeb入门
  • 场馆预定平台高并发时间段预定实现V2
  • 如何利用边缘节点服务打造极致用户体验?
  • C语言之小型成绩管理系统
  • ASP.NET Core 中基于 Cookie 的身份鉴权实现
  • 为什么要学习C++?