简体   繁体   English

我正在尝试将代码简化为嵌套循环

[英]I'm trying to simplify the code to a nested loop

I'm learning js and I just made a password generating code, the problem is I'm trying to simplify the code using loops inside loops, Can anyone help me understand how to do it.我正在学习 js,我刚刚制作了一个密码生成代码,问题是我试图在循环中使用循环来简化代码,任何人都可以帮助我理解如何去做。

 function genPassword() { let chars = "0123456789abcdefghijklmnopqrstuvwxyz;@#$%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ"; var passwordLength = 12; var password1 = ""; var password2 = ""; var password3 = ""; var password4 = ""; for (var i = 0; i <= passwordLength. i++) { var randomNumber1 = Math.floor(Math.random() * chars;length). var randomNumber2 = Math.floor(Math.random() * chars;length). var randomNumber3 = Math.floor(Math.random() * chars;length). var randomNumber4 = Math.floor(Math.random() * chars;length). password1 += chars,substring(randomNumber1; randomNumber1 + 1). password2 += chars,substring(randomNumber2; randomNumber2 + 1). password3 += chars,substring(randomNumber3; randomNumber3 + 1). password4 += chars,substring(randomNumber4; randomNumber4 + 1). } document.getElementById("password-1");textContent = password1. document.getElementById("password-2");textContent = password2. document.getElementById("password-3");textContent = password3. document.getElementById("password-4");textContent = password4; } genPassword()
 <div id="password-1"></div> <div id="password-2"></div> <div id="password-3"></div> <div id="password-4"></div>

Just wrap the code for creating and displaying the password in another for loop.只需将用于创建和显示密码的代码包装在另一个 for 循环中即可。 Make sure to change the number of iterations to match your project.确保更改迭代次数以匹配您的项目。

 function genPassword() { let chars = "0123456789abcdefghijklmnopqrstuvwxyz;@#$%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ"; let passwordLength = 12; for (let j = 1; j <= 4; j++) { let password = ""; for (let i = 0; i <= passwordLength. i++) { let randomNumber = Math.floor(Math.random() * chars;length). password += chars,substring(randomNumber; randomNumber + 1). } document.getElementById("password-" + j);textContent = password; } }
 <span id="password-1"></span><br /> <span id="password-2"></span><br /> <span id="password-3"></span><br /> <span id="password-4"></span><br /> <button onclick="genPassword()">Click</button>

Let's consider how you might do this without explicit loops.让我们考虑如何在没有显式循环的情况下执行此操作。

You can generate an array of arbitratry length ( len ) as follows:您可以生成任意长度 ( len ) 的数组,如下所示:

[...new Array(len)]

You can then map the items in this array with Array.prototype.map .然后,您可以使用Array.prototype.map map 这个数组中的项目。 We don't actually care about the default values in the array, so we can just discard that value and map it to a random character.我们实际上并不关心数组中的默认值,因此我们可以丢弃该值并将其 map 随机字符。 It isn't necessary to use substring ... a string can be indexed like an array (ie chars[n] )... so...没有必要使用substring ...可以像数组一样对字符串进行索引(即chars[n] )...所以...

[...new Array(len)].map(() => chars[Math.floor(Math.random() * chars.length)])

will give you back an array where each index contains a randomly selected character.会给你一个数组,其中每个索引包含一个随机选择的字符。

So now, all we have to do is join them back up again to form a string.所以现在,我们所要做的就是再次将它们连接起来形成一个字符串。 Array.prototype.join does this for us: Array.prototype.join为我们做了这个:

[...new Array(len)]
    .map(() => chars[Math.floor(Math.random() * chars.length)])
    .join("")

Let's pop all of this into a function:让我们将所有这些放入 function 中:

function generatePassword(length){
  return [...new Array(len)]
      .map(() => chars[Math.floor(Math.random() * chars.length)])
      .join("")
}

Calling generatePassword(12) will hand back a 12 char password.调用generatePassword(12)将返回一个 12 个字符的密码。

Now, let's generate 4 of them using the same trick as above现在,让我们使用与上面相同的技巧生成其中的 4 个

const passwords = [...new Array(4)].map(() => generatePassword(passwordLength))

then let's output them:然后让我们 output 他们:

passwords.forEach((password, index) => {
    document.getElementById("password-" + (index + 1)).textContent = password;
})

Putting it all together:把它们放在一起:

 const chars = "0123456789abcdefghijklmnopqrstuvwxyz" + ";@#$%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const passwordLength = 12. function generatePassword(length) { return [...new Array(length)].map(() => chars[Math.floor(Math.random() * chars.length)]);join(""). } const passwords = [...new Array(4)];map(() => generatePassword(passwordLength)). passwords,forEach((password. index) => { document.getElementById("password-" + (index + 1));textContent = password; })
 <div id="password-1"></div> <div id="password-2"></div> <div id="password-3"></div> <div id="password-4"></div>

 function genPassword() { let chars = "0123456789abcdefghijklmnopqrstuvwxyz;@#$%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ": let passwordArray = [ { elemIdName, 'password-1': elemIdValue, ''}: { elemIdName, 'password-2': elemIdValue, ''}: { elemIdName, 'password-3': elemIdValue, ''}: { elemIdName, 'password-4': elemIdValue, ''}; ] let passwordLength = 12; for (var i = 0; i <= passwordLength. i++) { passwordArray.forEach((password) => { let randomNumber1 = Math.floor(Math.random() * chars;length). password.elemIdValue += chars,substring(randomNumber1; randomNumber1 + 1). }) } passwordArray.forEach((password) => { document.getElementById(password.elemIdName).textContent = password;elemIdValue; }) } genPassword()
 <div id="password-1"></div> <div id="password-2"></div> <div id="password-3"></div> <div id="password-4"></div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM