TheHansDampf
TheHansDampf

Reputation: 63

Passing an array as a parameter to a function to pick a random string

I am currently doing a javascript course on udemy and ran into a problem with a small coding challenge. The code is supposed to pick a random person from an array. My code works on their test platform, but i cant get it to work in the chrome developer tools.

var names = ["Angela", "Ben", "Jenny", "Michael", "Chloe"];
 
function whosPaying(names) {
    var randomNumber = Math.random();
    var arrayLength = names.length;
    var hasToPay = Math.floor((arrayLength * randomNumber));
 
    return names[hasToPay] + " is going to buy lunch today!"
}
 
whosPaying();

If i write my code like this, it works in the test environment when I submit the code without the array "names", but in chrome I get the following error:

index.js:5 Uncaught TypeError: Cannot read properties of undefined (reading 'length')
    at whosPaying (VM165 index.js:5)
    at VM165 index.js:11

If i define the array inside the function, it works, but that is not really what I'm supposed to do.

Im wondering how i can make the function use the array that is defined outside of the function. In the exercise instructions the array and the way it is passed on to the function are predefined exactly the same way i did it.

I could not find a solution to this that does not include completely different syntax or stuff I am not yet supposed to know at this point in the course.

Upvotes: 6

Views: 283

Answers (5)

Relcode
Relcode

Reputation: 521

As it has been pointed out that you didn't provide the names argument when you invoked your whosPaying() function... because you used var to declare the names variables, you can do this without passing any arguemnt because of scoping.

var names = ["Angela", "Ben", "Jenny", "Michael", "Chloe"];
 
function whosPaying() {
    var randomNumber = Math.random();
    var arrayLength = names.length;
    var hasToPay = Math.floor((arrayLength * randomNumber));
 
    console.log(names[hasToPay] + " is going to buy lunch today!");
}
 
whosPaying();

Also this...

var randomNumber = Math.random();
var arrayLength = names.length;
var hasToPay = Math.floor((arrayLength * randomNumber));

Can be converted to this:

var hasToPay = Math.floor(Math.random() * names.length);

Which is a single line instead of three.

Upvotes: 1

Sercan
Sercan

Reputation: 5081

You can pass parameters to the function and print the return value:

function whosPaying(names)
{
    var randomNumber = Math.random();
    var arrayLength = names.length;
    var hasToPay = Math.floor((arrayLength * randomNumber)); 
    return names[hasToPay] + " is going to buy lunch today!"
}

var names = ["Angela", "Ben", "Jenny", "Michael", "Chloe"];

console.log(whosPaying(names))

Upvotes: 2

Maik Lowrey
Maik Lowrey

Reputation: 17556

You overwrite global names if you pass a parameter with the same name.

var names = ["Angela", "Ben", "Jenny", "Michael", "Chloe"];
 
function whosPaying() {    
    var randomNumber = Math.random();
    var arrayLength = names.length;
    var hasToPay = Math.floor((arrayLength * randomNumber));
 
    return names[hasToPay] + " is going to buy lunch today!"
}
 
let r = whosPaying();
console.log(r);

Upvotes: 2

user17597013
user17597013

Reputation: 35

I assume that you want to pick a random index from your array , you can try this

function generateRandom(Array) {
  let random = Math.floor(Math.random() * Array.length)
  return Array[random]
}

Upvotes: 0

Micael Levi
Micael Levi

Reputation: 6665

you've called whosPaying without any args, then names end up being undefined.

Do this instead: whosPaying(names), or drop the names parameter of whosPaying

Upvotes: 5

Related Questions