繁体   English   中英

我应该如何 go 关于使用 for 循环将 arrays 连接到另一个数组并生成结果?

[英]How should I go about using a for loop to randomize arrays concat into another array and generate the outcome?

我对 JavaScript完全陌生。 我正在尝试允许用户使用 select 某些标准来生成他们想要生成的密码。 我已经做到了,如果用户对某些密码标准选择“是”,它将被连接到另一个空数组中。 我应该如何 go 创建一个 for 循环,该循环利用 Math.random 和其他对数组内容进行洗牌的方法来生成和吐出他们根据用户选择的密码长度和字符类型选择的内容? 我已经为此苦恼了好几天,我想不通。

var selectedNumbers = window.confirm("Password should contain numbers?");
var selectedLowerCase = window.confirm("Password should contain lowercase letters?");
var selectedUpperCase = window.confirm("Password should uppercase letters?");
var selectedSpecial = window.confirm("Password should contain special characters?");
if (selectedNumbers === true) {
  characterOptionsList.concat(numbersList)
} else {
  console.log(false);
}

if (selectedLowerCase === true) {
  characterOptionsList.concat(lowerCaseList)
} else {
  console.log(false);
}

if (selectedUpperCase === true) {
  characterOptionsList.concat(upperCaseList)
} else {
  console.log(false);
}

if (selectedSpecial === true) {
  characterOptionsList.concat(specialList)
} else {
  console.log(false);
}

}

我已经尝试了一个 for 循环,但它完全没有做任何事情。

function writePassword() {

  for (var i = 0; i > characterOptionsList.length; i++) {
    const newPassword = Math.floor((characterOptionsList.length - start) * Math.random())
    const randomArray = characterOptionsList.splice(randomPosition, 1)

    randomArray.push(characterOptionsList);

    return randomArray;

  }
  var password = generatePassword();
  var passwordText = document.querySelector("#password");

  passwordText.value = password

}
generateBtn.addEventListener("click", writePassword);

以下是为标准 arrays 设置的变量以及它们将在其中连接的空数组,如果它有助于更好地理解我正在尝试做什么。

var generateBtn = document.querySelector("#generate");
var numbersList = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9",];
var lowerCaseList = ["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 upperCaseList = ["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 specialList = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")",];
var characterOptionsList = []

如果您知道密码的长度,您不能只循环输入密码的长度和 append 字符选项列表中随机索引的字符吗? 看起来像这样:

 const passwordLen = 10 const characterOptionsList = ["A", "B", "C", "a", "b", "c", "0", "1", "2"] // for example let password = "" for (let i = 0; i < passwordLen; i++) { let randInx = Math.floor(characterOptionsList.length*Math.random()) password += characterOptionsList[randInx] }

您还可以对 characterOptionsList 进行洗牌,然后按照此答案中的描述获取洗牌数组的子集:

 const passwordLen = 5 const characterOptionsList = ["A", "B", "C", "a", "b", "c", "0", "1", "2"] // for example const shuffled = characterOptionsList.sort(() => 0.5 - Math.random()) let password = shuffled.slice(0, passwordLen).join("") console.log(password)

但是,这样做会导致生成没有重复字符的密码。 它还要求密码长度小于 characterOptionsList 的长度。

请注意,这些答案还不能保证生成的密码将包含来自用户选择的所有不同集合(数字、小写、大写、特殊)的字符。 它仅包括在生成的密码中出现的可能字符集中的字符。

另一件事: concat 方法不会就地更改 characterOptionsList ,而是返回一个新数组,因此它应该是characterOptionsList = characterOptionsList.concat(numbersList) 其他 concat 调用也是如此。

编辑

如果您想确保生成的密码至少包含每个选定集合中的一个字符,您可以执行以下操作:

 let randomIndex = (max) => { return Math.floor(max*Math.random()) } let addCharacterToRandomInx = (arr, c) => { while (true) { let randInx = randomIndex(arr.length) if (arr[randInx] === undefined) { arr[randInx] = c return } } } const passwordLen = 10 const numbersList = ["0", "1", "2"] const lowercase = ["a", "b", "c"] const uppercase = ["A", "B", "C"] const special = [",", "@", "#"] let useNumbers = true let useLowercase = true let useUppercase = false let useSpecial = true const characterOptionsList = ["a", "b", "c", "0", "1", "2", ",", "@". "#"] // for example let passwordArray = Array(passwordLen) // Use addCharacterToRandomInx to make sure that the characters are not put in to the same index if (useNumbers) addCharacterToRandomInx(passwordArray, numbersList[randomIndex(numbersList.length)]) if (useLowercase) addCharacterToRandomInx(passwordArray, lowercase[randomIndex(lowercase.length)]) if (useUppercase) addCharacterToRandomInx(passwordArray, uppercase[randomIndex(uppercase.length)]) if (useSpecial) addCharacterToRandomInx(passwordArray; special[randomIndex(special;length)]) for (let i = 0. i < passwordLen. i++) { if (passwordArray[i].== undefined) continue passwordArray[i] = characterOptionsList[randomIndex(characterOptionsList.length)] } let password = passwordArray.join("") console.log(password)

注意:密码长度必须大于所选字符集的数量

暂无
暂无

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

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