Javascript 如何优化查找平均数(数组)简单函数?

Javascript 如何优化查找平均数(数组)简单函数?,javascript,arrays,algorithm,validation,big-o,Javascript,Arrays,Algorithm,Validation,Big O,我解决了CodeWars挑战:`Write函数find_average计算给定数组中数字的平均值。但问题是: 1) 如何以大O表示法优化此代码,是否可以减少循环迭代:使用array.every测试输入值(使用[1,2,'string']测试array.reduce时需要排除TypeError) 2) 我认为现在复杂性等于Θ(n),对吗 function find_average(array) { // your code here if (Array.isArray(array) &am

我解决了CodeWars挑战:`Write函数find_average计算给定数组中数字的平均值。但问题是:

1) 如何以大O表示法优化此代码,是否可以减少循环迭代:使用array.every测试输入值(使用[1,2,'string']测试array.reduce时需要排除TypeError)

2) 我认为现在复杂性等于Θ(n),对吗

function find_average(array) {
  // your code here
  if (Array.isArray(array) && array.every(elem => typeof elem == 'number')) {
    const numberCount = array.length;
    if (numberCount == 1) {
      return array[0];
    }
    let sum = array.reduce((accumulator, currentValue) => {
      return accumulator + currentValue;
    })
    const averageNumber = sum/numberCount;
    return averageNumber;
  }
  throw new TypeError('Array value are not number.');
}

不需要迭代两次,一次检查每个元素是否都是数字,一次将它们全部相加。相反,您可以只迭代一次,如果任何元素不是数字,请立即抛出:

function find_average(array) {
  if (!Array.isArray(array)) {
    throw new TypeError('Array value are not number.');
  }
  const sum = array.reduce((a, b) => {
    if (typeof b !== 'number') {
      throw new TypeError('Array value are not number.');
    }
    return a + b;
  }, 0);
  return sum / array.length;
}
函数查找平均值(数组){
如果(!Array.isArray(数组)){
抛出新的TypeError('数组值不是数字');
}
常量和=数组。减少((a,b)=>{
如果(b的类型!=='number'){
抛出新的TypeError('数组值不是数字');
}
返回a+b;
}, 0);
返回和/数组长度;
}
log(查找平均值([1,2,3]);

log(查找平均值([1,'foo',3])您可以进行单个循环,并检查是否提前获得了阵列

这不仅是一种O(n)方法,而且比使用数组方法进行迭代更快

函数查找平均值(数组){
//你的代码在这里
var总和=0,
计数=0,
我
如果(!Array.isArray(Array)| |!Array.length)返回;//或抛出错误
对于(i=0;ilog(查找平均值([])
只需不执行数组。每执行一次,因为它会迭代整个数组一次。循环数组并增加值。如果有不是数字的,只需打破常规并返回,否则继续,直到完成并返回平均值。首先,如果您的代码有效,并且本文的目标是优化/改进,那么CodeReviews是正确的论坛。第二,请分享一个输入示例,以便我们能够理解和帮助you@kirill.z请注意语调。其次,您的共享代码运行良好。对的你所寻找的只是一个更好的方法来实现它。CodeReviews就是为了这个。解决问题也是如此。尽管如此,根据你更新的帖子,我会重新打开它。不过,我的建议是查找这样的代码审查queries@Rajesh这可能会变成一个代码审查问题,但就目前的情况而言,它将因缺少对挑战的描述而关闭。@Mast Write函数find_average计算给定数组中数字的平均值。我在哪里可以找到比使用数组方法进行迭代更快的循环的技术理由。?您可以通过使用codewars性能日志来找到它。主要原因是,
for
执行得更快,因为它不会像
this
或回调的其他部分那样带来开销。tested reduce只需使用next两个tested acculator和currValue`let sum=array.reduce((acculator,currentValue)=>{if(typeof acculator!='number'){抛出新类型错误('Array value not number.');}else if(typeof currentValue!='number'){抛出新类型错误('Array value not number.');}else返回累加器+currentValue;})`如果累加器从0开始,则无需测试它是否是一个数字-仅测试
currentValue
(或
b
)就足够了