计算数组的模式值

问题描述

用于返回数组模式值的函数适用于除一项以外的所有测试。当我通过函数传递以下数组时,出现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
}