首页 > 解决方案 > 使用reduce从数组中取平均值。将您自己的方法添加到 Array 对象,以便下面的代码可以工作。3 种方法

问题描述

我正在尝试解决一项任务。我知道这是非常基本的,因为我刚刚开始并为训练营的技术面试而学习。如果有人能帮助我理解一些原因,我将不胜感激。以下代码应该可以添加我自己的方法。这是获得平均值的初学者练习。也许我可以用 for 循环来完成它,但我试图实现 reduce 方法。

这是给定的代码


var arr = [1, 2, 3, 4, 5];
var avg = arr.average();
console.log(avg);

我已经能够使用以下代码获得平均值。


var arr = [1, 2, 3, 4, 5];
function average() {
  const accPlusCur =(acc,cur) => acc + cur;
  const sumOfAll = arr.reduce(accPlusCur);
  return sumOfAll / arr.length;
};
console.log(average());
// => 3

问题是我并没有真正使用给定的代码。所以我用另一种方式重新编写了它,以尝试拥有一个可以应用于任何数组而不仅仅是这个特定数组的函数。但它不起作用。


var arr = [1, 2, 3, 4, 5];
function average(arrayName) {
  const accPlusCur = (acc,cur) {return acc + cur}, 0;
  const sumOfAll = arrayName.reduce(accPlusCur);
  return sumOfAll / arrayName.length;
};
const avg = average();
console.log(avg);

网上给出的解决方案如下。虽然我不是很明白。


Array.prototype.average = function() {
  var sum = this.reduce(function(prev, cur) { return prev + cur; });
   return sum / this.length;
}

var arr = [1, 2, 3, 4, 5];
var avg = arr.average();
console.log(avg); // => 3

有人可以帮我吗?为什么我的第二次尝试不像我的第一个选项那样工作。这个原型方法和“this”的不断使用是怎么回事。Whi是原型之前的数组词?

标签: javascriptarraysaverage

解决方案


在 Javascript 中,对象(通常)有一个内部原型。属性上可用的任何属性或方法在对象上也可用。例如,数组.join在原型上有一个方法:Array.prototype.join. 因此,您可以调用.join任何数组,例如

myArray.join('')

尽管它实际上join不是数组的属性 - 它是myArray.

类似地,通过在原型上放置一个函数,该函数可以被任何实例调用。

在原型方法内部时,this引用已调用该方法的对象。所以,例如,与

myArray.join('')

.join被调用时,this它里面指的是myArray.

在解决方案中,代码

var sum = this.reduce(function(prev, cur) { return prev + cur; });

计算调用该方法的数组的总和。由于该方法是 on Array.prototype,因此任何数组都可以访问该方法。

您的代码的问题:

var arr = [1, 2, 3, 4, 5];
function average(arrayName) {
  const accPlusCur = (acc,cur) {return acc + cur}, 0;
  const sumOfAll = arrayName.reduce(accPlusCur);
  return sumOfAll / arrayName.length;
};
const avg = average();
console.log(avg);

average接受一个参数(你想从中获得平均值的数组),但你没有传递它。

此外,累加器的初始值应该是您传递给的第二个.reduce参数:

var arr = [1, 2, 3, 4, 5];
function average(arrayName) {
  const accPlusCur = (acc,cur) => acc + cur;
  const sumOfAll = arrayName.reduce(accPlusCur, 0);
  return sumOfAll / arrayName.length;
}
const avg = average(arr);
console.log(avg);


推荐阅读