Reputation: 63
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
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
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
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
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
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