脚本返回不一致长度的字符串

时间:2018-05-10 16:41:01

标签: javascript recursion

这个脚本的目的是打印8"块"随机生成的字母数字值由短划线分隔,以形成39个字符的唯一ID。

  

E7L9-XNP4-UB4K-10PU-H8IZ-C69E-3IG2-6P6W

但是,我发现这个脚本有时会返回少于39个字符的字符串,其中的块只包含2或3个字符。

  

21-15-18-5UD1-V471-I158-J23R-M714

如果生成的块少于4个字符,我尝试放置一个以递归方式运行blockBuilder()的条件,但这些有缺陷的ID仍会打印到页面上。



var alphabet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";

var alphaArray = alphabet.split(",").map(function(l) {
  return l.toUpperCase()
});

function randomLetter() {
  var index = Math.floor(Math.random() * 26);
  return alphaArray[index];
}

function randomNumber() {
  return Math.floor(Math.random() * 10);
}

function blockBuilder() {
  var block = randomChar() + randomChar() + randomChar() + randomChar();

  if (block.length < 4) {
    blockBuilder(); //recursive check
  }

  return block;
}

function idBuilder() {
  return blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder()


}

function randomChar() {
  return Math.floor(Math.random() * 2) == 0 ? randomLetter() : randomNumber();
}

for (var i = 0; i < 100; i++) {
  var v = idBuilder();

  document.write(v + "<br>");

}
&#13;
&#13;
&#13;

我在这里缺少什么?感谢。

2 个答案:

答案 0 :(得分:6)

这是因为您的randomNumber函数返回数字,而不是数字。如果你连续两个,它们被加在一起,而不是连接在一起。例如,在这一行:

var block = randomChar() + randomChar() + randomChar() + randomChar();

...假设第一个调用返回2,第二个返回3,第三个返回4,第四个返回"X"。这是:

var block = 2 + 3 + 4 + "X";

...这是"9X",而不是"234X"。这将在第一次和第二次调用(至少)返回数字时发生。

转换为字符串解决了它:

function randomNumber() {
  return String(Math.floor(Math.random() * 10));
}

示例:

var alphabet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";

var alphaArray = alphabet.split(",").map(function(l) {
  return l.toUpperCase()
});

function randomLetter() {
  var index = Math.floor(Math.random() * 26);
  return alphaArray[index];
}

function randomNumber() {
  return String(Math.floor(Math.random() * 10));
}

function blockBuilder() {
  var block = randomChar() + randomChar() + randomChar() + randomChar();

  if (block.length < 4) {
    blockBuilder(); //recursive check
  }

  return block;
}

function idBuilder() {
  return blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder()


}

function randomChar() {
  return Math.floor(Math.random() * 2) == 0 ? randomLetter() : randomNumber()
}

for (var i = 0; i < 100; i++) {
  var v = idBuilder();

  document.write(v + "<br>");

}

旁注:if (block.length < 4)是不必要的,检查不可能是真的。 (只是再次调用blockBuilder而不对其结果做任何事情也不会有任何帮助。)

附注2:您的randomChar函数选择一个字母或一个数字(数字),每个都有50/50的机会。这减少了你的弦乐的独特性,只有一半的时间限制在10个选择。您可以考虑执行Barmar asked about并将数字添加到整个列表中,这将使A实现更简单,并且B)在36个选项中更均匀地传播数据。

例如:

var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split("");

function blockBuilder() {
  var block = randomChar() + randomChar() + randomChar() + randomChar();
  return block;
}

function idBuilder() {
  return blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder()
}

function randomChar() {
  return chars[Math.floor(Math.random() * chars.length)];
}

for (var i = 0; i < 100; i++) {
  var v = idBuilder();
  document.write(v + "<br>");
}

答案 1 :(得分:1)

乍一看,在我看来,有时你只会获得数字,因此javascript引擎会将它转换为像2+1+2+9 => 14而不是2129这样的数字,尝试这样的代替randomChar()功能,您甚至不需要检查长度:return Math.floor(Math.random() * 2) == 0 ? randomLetter() : randomNumber().toString();