JavaScript: возвращаемое значение рейтинга из массива с использованием внутреннего метода-прототипа внутри функции фабрики - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь создать объект из фабричной функции.Этот объект содержит внутренний прототип, который состоит из различных методов.

Я застрял на том, что нужно вернуть из метода getStars ().

Внутренний прототип:

const obj = {

    addStars(rating){
        return this.rating.push(rating)
    },
    getStars(?){
        ??? 
    }
}

Заводская функция:

function createRecipe (ingredients, cooktime, rating='') {

    let instance = Object.create(obj)

        instance.ingredients = ingredients;
        instance.cooktime = cooktime;
        instance.rating = []; 

        return instance 
}

Создаемый объект:

const recipe1 = createRecipe(['cheese', 'dough', 'basil'], 20)

Прямо сейчас я могу добавить звездные оценки разных людей в массив рейтинга, который находится в свойстве объекта.Как показано ниже:

recipe1.addStars('*****');
recipe1.addStars('***');
recipe1.addStars('*');

Мой вопрос заключается в том, что я хочу, чтобы метод getStars в моем внутреннем прототипе принимал среднее значение всех звездных оценок, добавленных в массив «rating».

Что я надеюсь увидеть:

recipe1.getStars();  // returns 3 

Как мне манипулировать методом getStars (), чтобы получить желаемый результат?

1 Ответ

1 голос
/ 30 июня 2019

Просто используйте reduce для суммирования всех значений, а затем разделите на длину.

getStars() {
  let allStars = this.ratings.reduce((a, { length: c }) => a + c, 0);
  let avg = allStars / this.ratings.length;
  return avg;
}

Или однострочник:

getStars() {
  return this.ratings.reduce((a, { length: c }) => a + c, 0) / this.ratings.length;
}
...