0

I am trying to generate a random password with the following code I have. When I run it, I get undefined.

Where would my 'undefined' be coming from?**

```

// Assignment Code

   var charString = ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklnmopqrstuvwxyz", "0123456789", 
 "~!@#$%^&*()-_=+"];


 var userInput = [];

 var password = "";

 var generateBtn = document.querySelector("#generate");

    // Write password to the #password input
  function writePassword() {
 password = generatePassword();
   var passwordText = document.querySelector("#password");

  passwordText.value = password;

 }

 // Character length prompt
 function generatePassword() {
  var characterLength = 0
   while ((characterLength < 8 || characterLength > 128) || Number.isInteger(characterLength) === 
false) {
 characterLength = parseInt(prompt("How many characters would you like your password to be? (8- 
128)"));

   }

   var upper = false
   var lower = false
   var number = false
    var symbol = false

  while (!upper && !lower && !number && !symbol) {

  // Uppercase pop up
    upper = confirm("Click OK to confirm uppercase characters");

   // Lowercase pop up
   lower = confirm("Click OK to confirm lowercase characters");

   // Numeric pop up
   number = confirm("Click OK to confirm numeric characters");

   // Special charcter  pop up
  symbol = confirm("Click OK to confirm special characters (~!@#$%^&*()-_=+)");

  }

   if (upper) {
      userInput += charString[0];

   }

   if (lower) {
      userInput += charString[1]

   }


    if (number) {
     userInput += charString[2]

     }


    if (symbol) {
     userInput += charString[3]

     }

     var password = "";

   for (var i = 1; i <= userInput.length; i++) {
      var index = (Math.floor(Math.random) * userInput);
     password = password + userInput[index]
  }

  return password

}



// Add event listener to generate button
 generateBtn.addEventListener("click", writePassword);


```
2
  • Can you provide the error stack? Commented Nov 1, 2020 at 6:10
  • 1
    since your code is HTML/js, consider creating a runnable code snippet to assist other reproduce the issue easily. (you can hit Ctrl+M in the question editor) Commented Nov 1, 2020 at 6:30

3 Answers 3

1

I fixed your code and made some observations in the snippet

// Assignment Code

var charString = ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklnmopqrstuvwxyz", "0123456789", "~!@#$%^&*()-_=+"];

var userInput = [];

var password = "";

var generateBtn = document.querySelector("#generate");

// Write password to the #password input
function writePassword() {
    password = generatePassword();
    var passwordText = document.querySelector("#password");

    passwordText.value = password;
}

// Character length prompt
function generatePassword() {
    var characterLength = 0
    while ((characterLength < 8 || characterLength > 128) || Number.isInteger(characterLength) === false) {
        characterLength = parseInt(prompt("How many characters would you like your password to be? (8-128)"));
    }

    var upper = false
    var lower = false
    var number = false
    var symbol = false

    while (!upper && !lower && !number && !symbol) {

        // Uppercase pop up
        upper = confirm("Click OK to confirm uppercase characters");

        // Lowercase pop up
        lower = confirm("Click OK to confirm lowercase characters");

        // Numeric pop up
        number = confirm("Click OK to confirm numeric characters");

        // Special charcter  pop up
        symbol = confirm("Click OK to confirm special characters (~!@#$%^&*()-_=+)");
    }

    // userInput is an array, so you should push values into it.
    if (upper) {
        userInput.push(charString[0]);
    }

    if (lower) {
        userInput.push(charString[1])
    }

    if (number) {
        userInput.push(charString[2])
    }

    if (symbol) {
        userInput.push(charString[3])
    }

    var password = "";

    // join all array elements into a single one, and then split in order
    // to get an array of characters
    userInput = userInput.join("").split("");

    // You should start your for statement at position 0, not 1
    // and I guess it should be < than characterLength, not userInput.length
    for (var i = 0; i < characterLength; i++) {
        // Math.random is a function so you were missing the parenthesis Math.random()
        // also Math.random() should be times userInput.length
        // so they should be inside the same parenthesis
        var index = (Math.floor(Math.random() * userInput.length));
        password = password + userInput[index]
    }

    return password
}

// Add event listener to generate button
generateBtn.addEventListener("click", writePassword);
<button id="generate">Generate</button>
<br>
<input type="text" id="password">

Sign up to request clarification or add additional context in comments.

Comments

0

I made some changes to your types selection to avoid an infinite loop. Your problem was your random index generation. There you go:

var charString = ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklnmopqrstuvwxyz", "0123456789", 
 "~!@#$%^&*()-_=+"];

var userInput = "";

var password = "";

var generateBtn = document.querySelector("#generate");

// Write password to the #password input
function writePassword() {
  var passwordText = document.querySelector("#password");
  password = generatePassword();
  passwordText.value = ''; // Clear prev value
  passwordText.value = password;
}

// Character length prompt
function generatePassword() {
  var characterLength = 0
  while ((characterLength < 8 || characterLength > 128) || Number.isInteger(characterLength) === 
false) {
  characterLength = parseInt(prompt(`How many characters would you like your password to be? (8 
128)`));
  }

  var upper = false
  var lower = false
  var number = false
  var symbol = false

  while (true) {
    // Uppercase pop up
    upper = confirm("Click OK to confirm uppercase characters");

    // Lowercase pop up
    lower = confirm("Click OK to confirm lowercase characters");

    // Numeric pop up
    number = confirm("Click OK to confirm numeric characters");

    // Special charcter  pop up
    symbol = confirm("Click OK to confirm special characters (~!@#$%^&*()-_=+)");

    break;
  }

  console.log('Using upper', upper);
  console.log('Using lower', lower);
  console.log('Using number', number);
  console.log('Using symbol', symbol);

  upper && (userInput += charString[0])

  lower && (userInput += charString[1])

  number && (userInput += charString[2])

  symbol && (userInput += charString[3])

  var password = "";

  for (var i = 0; i < characterLength; i++) {
    var index = Math.floor(Math.random() * userInput.length);
    password += userInput[index]
  }

  return password

}



// Add event listener to generate button
generateBtn.addEventListener("click", writePassword);
<button id="generate">Generate</button>
<input id="password"/>

Comments

0

Change

 var index = (Math.floor(Math.random) * userInput);

To

 var index = (Math.floor(Math.random() * userInput.length));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.