在JavaScript中生成一个随机的字母数字(大写,小写和数字)字符串来用作可能唯一的标识符的最短方法是什么?
当前回答
function randomString(len) {
var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}
简介:
创建一个我们想要的大小的数组(因为javascript中没有等价的range(len))。 对于数组中的每个元素:从p中随机选择一个字符并将其添加到字符串中 返回生成的字符串。
这里做一些解释:
[...阵列望远镜(len)]
Array(len)或new Array(len)创建一个指针未定义的数组。单行语句将更难实现。Spread语法方便地定义了指针(现在它们指向未定义的对象!)
.reduce (
在本例中,将数组缩减为单个字符串。reduce功能在大多数语言中都很常见,值得学习。
a = > a+...
我们用的是箭头函数。
A是累加器。在本例中,它是当我们完成时将返回的最终结果字符串(你知道它是一个字符串,因为reduce函数的第二个参数initialValue是一个空字符串:")。基本上就是:用p[~~(Math.random()*p.length)]转换数组中的每个元素,将结果附加到a字符串中,当你完成时给我一个。
p[…]
P是我们要从中选择的字符串。你可以像访问索引一样访问字符串中的字符(例如,"abcdefg"[3]给了我们"d")
~ ~ (math . random () * p.length)
Math.random()返回一个位于[0,1]之间的浮点数。Math.floor(Math.random()*max)是javascript中获取随机整数的事实标准。~是javascript中按位的NOT操作符。 ~~是Math的一种更短、更快、更有趣的表达方式。(这里有一些信息
其他回答
如果你只想允许特定的字符,你也可以这样做:
function randomString(length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
}
var rString = randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
下面是一个演示的jsfiddle: http://jsfiddle.net/wSQBx/
另一种方法是使用一个特殊的字符串,告诉函数使用什么类型的字符。你可以这样做:
function randomString(length, chars) {
var mask = '';
if (chars.indexOf('a') > -1) mask += 'abcdefghijklmnopqrstuvwxyz';
if (chars.indexOf('A') > -1) mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
if (chars.indexOf('#') > -1) mask += '0123456789';
if (chars.indexOf('!') > -1) mask += '~`!@#$%^&*()_+-={}[]:";\'<>?,./|\\';
var result = '';
for (var i = length; i > 0; --i) result += mask[Math.floor(Math.random() * mask.length)];
return result;
}
console.log(randomString(16, 'aA'));
console.log(randomString(32, '#aA'));
console.log(randomString(64, '#A!'));
小提琴:http://jsfiddle.net/wSQBx/2/
或者,像下面描述的那样使用base36方法,你可以这样做:
function randomString(length) {
return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
}
我使用@Nimphious优秀的第二种方法,发现偶尔返回的字符串是数字-而不是字母数字。 我使用的解决方案是测试使用!isNaN,并再次使用递归调用该函数。 何苦呢?我使用这个函数来创建对象键,如果所有的键都是字母数字,那么所有的键都可以正常排序,但如果你使用 数字作为键与字母数字(字符串)混合在一起循环遍历对象将产生与原始顺序不同的顺序。
function newRandomString(length, chars) {
var mask = '';
if (chars.indexOf('a') > -1) mask += 'abcdefghijklmnopqrstuvwxyz';
if (chars.indexOf('A') > -1) mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
if (chars.indexOf('#') > -1) mask += '0123456789';
if (chars.indexOf('$') > -1) mask += '0123456789';
var result = '';
for (var i = length; i > 0; --i) result += mask[Math.floor(Math.random() *
mask.length)];
/*
we need a string not a number !isNaN(result)) will return true if '1234' or '3E77'
because if we're looping through object keys (created by newRandomString()) and
a number is used and all the other keys are strings then the number will
be first even if it was the 2nd or third key in object
*/
//use recursion to try again
if(!isNaN(result)){
console.log('found a number....:'+result);
return newRandomString(length, chars)
}else{
return result;
}
};
var i=0;
while (i < 1000) {
var a = newRandomString(4, '#$aA');
console.log(i+' - '+a);
//now we're using recursion this won't occur
if(!isNaN(a)){
console.log('=============='+i+' - '+a);
}
i++;
}
console.log('3E77:'+!isNaN('3E77'));//true
console.log('1234:'+!isNaN('1234'));//true
console.log('ab34:'+!isNaN('ab34'));//false
或者根据Jar Jar的建议,这是我在最近的一个项目中使用的方法(以克服长度限制):
var randomString = function (len, bits)
{
bits = bits || 36;
var outStr = "", newStr;
while (outStr.length < len)
{
newStr = Math.random().toString(bits).slice(2);
outStr += newStr.slice(0, Math.min(newStr.length, (len - outStr.length)));
}
return outStr.toUpperCase();
};
Use:
randomString(12, 16); // 12 hexadecimal characters
randomString(200); // 200 alphanumeric characters
一个取长度的简单函数
getRandomToken(len: number): string {
return Math.random().toString(36).substr(2, len);
}
如果你传递6,它会生成6位字母数字
更新: 一行程序解决方案,随机20个字符(字母数字小写):
Array.from(Array(20), () => Math.floor(Math.random() * 36).toString(36)).join('');
或者用lodash更短:
_.times(20, () => _.random(35).toString(36)).join('');
推荐文章
- 如何使用Jest测试对象键和值是否相等?
- 将长模板文字行换行为多行,而无需在字符串中创建新行
- 如何在JavaScript中映射/减少/过滤一个集?
- Bower: ENOGIT Git未安装或不在PATH中
- 添加javascript选项选择
- 在Node.js中克隆对象
- 为什么在JavaScript的Date构造函数中month参数的范围从0到11 ?
- 使用JavaScript更改URL参数并指定默认值
- 在window.setTimeout()发生之前取消/终止
- 如何删除未定义和空值从一个对象使用lodash?
- 检测当用户滚动到底部的div与jQuery
- 在JavaScript中检查字符串包含另一个子字符串的最快方法?
- 检测视口方向,如果方向是纵向显示警告消息通知用户的指示
- ASP。NET MVC 3 Razor:在head标签中包含JavaScript文件
- 禁用从HTML页面中拖动图像