问题描述
用于返回数组模式值的函数适用于除一项以外的所有测试。当我通过函数传递以下数组时,出现TypeError。我发现它与传递的数组中的数字0有关,但是我不知道为什么,也不知道如何解决问题。这就是我的mode函数和typeerror函数的样子。
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.')
}
}
如果我将[3,5,2,-5,9,2,-5,5,10,4,1,0,-1,9,0]传递给函数,则会收到TypeError:传递的数组可能只包含有效数字”,但我希望得到[-5、0、2、5、9]
解决方法
您传递给Array.prototype.every()的回调函数应返回一个布尔值。如果它(回调函数)为数组的每个元素返回true
,则只有every
方法将返回true
。
请注意回调中的这一行:
if ((typeof elements == 'number')){
return elements
您将返回元素而不是布尔值。当回调返回0
时,它会自动转换为布尔值false
。因此every()
返回false
,导致函数抛出TypeError
。
修复回调:
//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';
}
可以写成ES6箭头功能:
const checkIfNumber = element => typeof element == 'number';
,
您的问题可以降级为
function checkIfNumber (elements) {
if ((typeof elements == 'number')){
return elements
}
}
console.log([3].every(checkIfNumber)); //true
console.log([0].every(checkIfNumber)); //false
console.log(['str'].every(checkIfNumber)); //false
Array。每当回调返回时都期望true / false,
但返回0 ==返回false。
因此,您可以通过这种方式进行修复
if ((typeof elements == 'number')){
return true
}