计算数组的众数
Calculating the mode value of an array
返回数组众数的函数适用于除一个测试之外的所有测试。当我通过函数传递以下数组时,我得到一个 TypeError。想通了是不是和传过来的数组中的数字0有关系,但是不知道为什么,也不知道怎么解决。这就是我的模式函数和类型错误函数的样子。
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() 的回调函数应该 return 一个布尔值。如果它(回调函数)对数组的每个元素 returns true
那么只有 every
方法会 return true
.
在你的回调中注意这一行:
if ((typeof elements == 'number')){
return elements
您正在 returning 元素而不是布尔值。当回调 return 是 0
时,它会自动转换为布尔值 false
。因此 every()
returns 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.every 期望回调 return,
为真/假
但是 return 0 == return 错误。
所以你可以这样修复
if ((typeof elements == 'number')){
return true
}
返回数组众数的函数适用于除一个测试之外的所有测试。当我通过函数传递以下数组时,我得到一个 TypeError。想通了是不是和传过来的数组中的数字0有关系,但是不知道为什么,也不知道怎么解决。这就是我的模式函数和类型错误函数的样子。
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() 的回调函数应该 return 一个布尔值。如果它(回调函数)对数组的每个元素 returns true
那么只有 every
方法会 return true
.
在你的回调中注意这一行:
if ((typeof elements == 'number')){
return elements
您正在 returning 元素而不是布尔值。当回调 return 是 0
时,它会自动转换为布尔值 false
。因此 every()
returns 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.every 期望回调 return,
为真/假
但是 return 0 == return 错误。
所以你可以这样修复
if ((typeof elements == 'number')){
return true
}