计算数组的众数

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
}