首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >平均从数组使用约简。将自己的方法添加到Array对象中,这样下面的代码就可以工作了。3种方法

平均从数组使用约简。将自己的方法添加到Array对象中,这样下面的代码就可以工作了。3种方法
EN

Stack Overflow用户
提问于 2019-10-14 03:46:15
回答 2查看 522关注 0票数 0

我在努力解决一项任务。我知道这是非常基本的,因为我才刚开始学习,准备参加一个训练营的技术面试。如果有人能帮我理解一些原因,我会非常感激的。下面的代码应该可以添加我自己的方法。这是一个初学者的锻炼,以获得平均水平。我本可以使用for循环来完成这一任务,但我试图实现reduce方法。

这是给定的代码

代码语言:javascript
运行
复制
var arr = [1, 2, 3, 4, 5];
var avg = arr.average();
console.log(avg);

我已经得到了以下代码的平均值。

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
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);

在线给出的解决方案如下。虽然我不太明白。

代码语言:javascript
运行
复制
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

有人能帮帮我吗?为什么我第二次尝试不像我的第一个选择那样工作。这个原型方法的特点是什么,以及“这个”的优点。在原型之前,数组字是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-14 03:52:37

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

代码语言:javascript
运行
复制
myArray.join('')

尽管join实际上不是数组的属性,但它是myArray内部原型的属性。

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

在prototype方法中,this引用方法被调用的对象。所以.

代码语言:javascript
运行
复制
myArray.join('')

当调用.join时,它内部的this指的是myArray

在解决方案中,代码

代码语言:javascript
运行
复制
var sum = this.reduce(function(prev, cur) { return prev + cur; });

计算调用该方法的数组的和。由于该方法在Array.prototype上,任何数组都可以访问该方法。

代码的问题是:

代码语言:javascript
运行
复制
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的第二个参数。

代码语言:javascript
运行
复制
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);

票数 1
EN

Stack Overflow用户

发布于 2019-10-14 04:22:16

谢谢你抽出时间来帮忙。我真的很感激。所以现在我理解了.this,对于原型给出的答案,如果我正确理解,下面的原型函数将是某种声明,一个函数

代码语言:javascript
运行
复制
Array.prototype.average = function() {
  // calculate sum
  var sum = this.reduce(function(prev, cur) { return prev + cur; });
  // return sum divided by number of elements
  return sum / this.length;
}

后来,它被

代码语言:javascript
运行
复制
var avg = arr.average();

对吗?

至于我正在尝试的第二种方法,我一分钟前才意识到自己做错了什么,然后才检查了这个答案。现在这段代码运行得非常好。

代码语言:javascript
运行
复制
const arr = [1, 2, 3, 4, 5];
function average(x) {
  const sumOfAll = x.reduce((acc, cur) => acc + cur, 0);
  return sumOfAll / x.length;
};
const averageVariable = average(arr); 
console.log(averageVariable);

再次,非常感谢你的帮助和奉献时间来帮助乞丐。总有一天我会做同样的事,等我做得更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58369867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档