簡體   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