The function for returning the mode value of an array works on every test except one. When I pass the following array through the function, I get a TypeError. I figured out that it has something to do with the number 0 in the passed array, but I don't know why and I don't know how to solve the problem. This is what my mode function and my typeerror function looks like.
function mode (arr) {
throwErrors(arr)
const numberOccurence = {}
const mostOccurent = []
for (const numberValues of arr) {
if (numberOccurence[numberValues]) {
numberOccurence[numberValues] += 1
} else {
numberOccurence[numberValues] = 1
}
}
let timesOccured = Object.values(numberOccurence)
let numbersSorted = timesOccured.sort((a, b) => b - a)
for (const keys of Object.keys(numberOccurence)) {
if (numberOccurence[keys] === numbersSorted[0]) {
mostOccurent.push(Number(keys))
}
}
return mostOccurent.sort((a, b) => a - b)
}
function throwErrors (functionParameter) {
if (!Array.isArray(functionParameter)) {
throw new TypeError('The passed argument is not an array.')
} else if (functionParameter.length === 0) {
throw new Error('The passed array contains no elements.')
} else if (!functionParameter.every(function checkIfNumber (elements) {
if ((typeof elements == 'number')){
return elements
}
})) {
throw new TypeError('The passed array may only contain valid numbers.')
}
}
If I pass [3, 5, 2, -5, 9, 2, -5, 5, 10, 4, 1, 0, -1, 9, 0] to the function, I get TypeError: "The passed array may only contain valid numbers", but I expected to get [-5, 0, 2, 5, 9]
The callback function that you pass to Array.prototype.every() should return a boolean value. If it (the callback function) returns true
for every element of array then only theevery
method will return true
.
Note this line in your callback :
if ((typeof elements == 'number')){
return elements
You are returning element instead of boolean value. When the callback returns a 0
it is automatically casted to boolean false
. and thus the every()
returns false
causing function to throw the TypeError
.
Fix the callback :
//renaming `elements` to `element` as it's single element
//return the result of boolean expression instead of using if statement explicitly
function checkIfNumber (element) {
return typeof element == 'number';
}
Can be written as ES6 arrow function :
const checkIfNumber = element => typeof element == 'number';