Среднее из массива с использованием Reduce. Добавьте свой собственный метод к объекту Array, чтобы следующий код работал. 3 подхода - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь решить задачу. Я знаю, это довольно просто, так как я только начинаю и готовлюсь к техническому интервью для буткемпа. Буду очень признателен, если кто-нибудь поможет мне понять, почему. Следующий код должен работать, добавляя мой собственный метод. Это начальное упражнение для получения среднего. Возможно, я мог бы сделать это с помощью цикла 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». Почему слово Array перед прототипом?

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Спасибо, что нашли время, чтобы помочь. Я очень ценю это. Итак, теперь я понимаю. Это что касается прототипа данного ответа, если я правильно понимаю, следующая функция-прототип была бы как бы объявлена ​​функцией

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;
}

И после этого она вызывается

var avg = arr.average();

Это правильно?

Что касается второго подхода, который я пробовал, я понял, что я делал неправильно, всего минуту назад, прежде чем проверить этот ответ. И теперь этот код работает отлично.


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 голосов
/ 14 октября 2019

В 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; });

вычисляет сумму массива, к которому был вызван метод. Так как метод включен 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принимает параметр (массив, из которого вы хотите получить среднее значение), но вы не передаете его.

Кроме того, начальное значение для аккумулятора должно быть параметром second , который выперейти к .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);
...