javascript - 使用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是原型之前的数组词?
解决方案
在 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);
推荐阅读
- firebase - 如何在 Firebase 托管上配置不同的子域,以便每个子域提供不同的内容?
- flutter - (溪流
- 不支持列表内的列表?)颤动firestore存储对象列表
- c++ - 使用 RTTI 从实现接口 c++ 的对象中获取类名
- javascript - 如何将 mocha 与inquirer.js 结合使用
- javascript - NextJS 在生产中重写
- javascript - 使用javascript计算动态添加的行中最后一列的总和
- c++ - 在 VSCode 上使用 GCC(9.2.0) 编译的 .exe 文件在执行时未运行
- android - 当我们在 ViewModel 中延迟加载 LiveData 时进行单元测试
- list - 如何从飞镖列表中删除地图
- docker - Docker 运行 - 如何在容器之间共享 UTS 命名空间?