Как объединить два объекта и вычислить среднее значение их значений в Javascript?

#javascript

#javascript

Вопрос:

Я изучаю TDD и хотел бы создать функцию, которая ожидала бы этого результата.

 //What I expect

[
    {book_id: 1, name:'NameBook', average: x},
    {book_id: 2, name:'NameBook', average: x},
    {book_id: 3, name:'NameBook', average: x},
    {book_id: 4, name:'NameBook', average: x},
    {book_id: 5, name:'NameBook', average: x},
    {book_id: 6, name:'NameBook', average: x},
    {book_id: 7, name:'NameBook', average: x},
]
 

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

Я публикую здесь то, что я должен сделать https://jsfiddle.net/thiagolmoraes/5xsk7Lgw/1 /

Любой может мне помочь.

     const getBooks = () => {
        return [
            { id: 1, name: 'Python Data Science' },
            { id: 2, name: 'Python Machine Learning' },
            { id: 3, name: 'Development Flask' },
            { id: 4, name: 'Mongo Database' },
            { id: 5, name: 'ULM for Dummies' },
            { id: 6, name: 'Java for Dummies' },
            { id: 7, name: 'Learn Rust in 2 hours' },
        ]
    }


 const getRating = () => {
        return [
            { book_id: 1, client_id: 1, rating: 4.5 },
            { book_id: 1, client_id: 4, rating: 5 },
            { book_id: 1, client_id: 25, rating: 5 },
            { book_id: 1, client_id: 2112, rating: 4 },
    
            { book_id: 2, client_id: 34, rating: 3 },
            { book_id: 2, client_id: 123, rating: 4 },
            { book_id: 2, client_id: 23, rating: 4 },
            { book_id: 2, client_id: 255, rating: 4 },
    
            { book_id: 3, client_id: 98, rating: 2 },
            { book_id: 3, client_id: 45, rating: 1 },
            { book_id: 3, client_id: 223, rating: 3 },
            { book_id: 3, client_id: 213, rating: 1.5 },
    
            { book_id: 4, client_id: 652, rating: 4.5 },
            { book_id: 4, client_id: 42, rating: 4.5 },
            { book_id: 4, client_id: 562, rating: 4.5 },
    
            { book_id: 5, client_id: 2, rating: 5 },
            { book_id: 5, client_id: 2, rating: 5 },
            { book_id: 5, client_id: 2, rating: 5 },
    
            { book_id: 6, client_id: 2, rating: 4.5 },
            { book_id: 6, client_id: 2, rating: 4.5 },
            { book_id: 6, client_id: 2, rating: 4.5 },
    
            { book_id: 7, client_id: 2, rating: 4.5 },
            { book_id: 7, client_id: 2, rating: 4.5 },
            { book_id: 7, client_id: 2, rating: 4.5 },
            { book_id: 7, client_id: 2, rating: 4.5 },
            { book_id: 7, client_id: 2, rating: 4.5 },
        ]
    }
    

const getBooksWithRatings = () => {
    return getBooks().map((book) => {
        book.ratings = getRating().filter((r) => r.book_id === book.id);
        return book;
    });

};
    
console.log(getBooksWithRatings()) 

Комментарии:

1. Похоже, вы сделали хорошую попытку в скрипке JS! Не могли бы вы скопировать это в свой вопрос здесь, чтобы людям было легче видеть?

2. Извините, я обновлю

Ответ №1:

Кажется, ты был почти на месте. Вам просто нужно вычислить сумму массива рейтингов, а затем разделить на его длину. Это должно завершить задачу за вас.

 const getBooks = () => {
  return [
    { id: 1, name: "Python Data Science" },
    { id: 2, name: "Python Machine Learning" },
    { id: 3, name: "Development Flask" },
    { id: 4, name: "Mongo Database" },
    { id: 5, name: "ULM for Dummies" },
    { id: 6, name: "Java for Dummies" },
    { id: 7, name: "Learn Rust in 2 hours" },
  ];
};

const getRating = () => {
  return [
    { book_id: 1, client_id: 1, rating: 4.5 },
    { book_id: 1, client_id: 4, rating: 5 },
    { book_id: 1, client_id: 25, rating: 5 },
    { book_id: 1, client_id: 2112, rating: 4 },

    { book_id: 2, client_id: 34, rating: 3 },
    { book_id: 2, client_id: 123, rating: 4 },
    { book_id: 2, client_id: 23, rating: 4 },
    { book_id: 2, client_id: 255, rating: 4 },

    { book_id: 3, client_id: 98, rating: 2 },
    { book_id: 3, client_id: 45, rating: 1 },
    { book_id: 3, client_id: 223, rating: 3 },
    { book_id: 3, client_id: 213, rating: 1.5 },

    { book_id: 4, client_id: 652, rating: 4.5 },
    { book_id: 4, client_id: 42, rating: 4.5 },
    { book_id: 4, client_id: 562, rating: 4.5 },

    { book_id: 5, client_id: 2, rating: 5 },
    { book_id: 5, client_id: 2, rating: 5 },
    { book_id: 5, client_id: 2, rating: 5 },

    { book_id: 6, client_id: 2, rating: 4.5 },
    { book_id: 6, client_id: 2, rating: 4.5 },
    { book_id: 6, client_id: 2, rating: 4.5 },

    { book_id: 7, client_id: 2, rating: 4.5 },
    { book_id: 7, client_id: 2, rating: 4.5 },
    { book_id: 7, client_id: 2, rating: 4.5 },
    { book_id: 7, client_id: 2, rating: 4.5 },
    { book_id: 7, client_id: 2, rating: 4.5 },
  ];
};

const getBooksWithRatings = () => {
  return getBooks().map((book) => {
    const ratings = getRating().filter((r) => r.book_id === book.id);
    book.average = ratings.reduce((acc, el) => acc   el.rating, 0) / ratings.length;
    return book;
  });
};

console.log(getBooksWithRatings()); 

Комментарии:

1. Спасибо, Ник, не мог бы ты объяснить мне насчет этого сокращения?

2. Конечно, reduce метод принимает функцию с четырьмя аргументами: накопитель, текущий элемент, индекс текущего элемента и исходный массив. Здесь я использую только первые два аргумента. Это 0 начальное значение для нашего аккумулятора. reduce перебирает массив и добавляет e.rating его в накопитель, каждый раз получая новый накопитель. По сути, это суммируется el.rating по всему массиву.

Ответ №2:

Вы можете использовать Array#reduce для нахождения суммы отфильтрованного массива и деления на его длину, чтобы найти среднее значение. Чтобы предотвратить изменение объектов в исходном массиве, вы можете использовать синтаксис распространения.

 const getBooks = () => {
    return [
        { id: 1, name: 'Python Data Science' },
        { id: 2, name: 'Python Machine Learning' },
        { id: 3, name: 'Development Flask' },
        { id: 4, name: 'Mongo Database' },
        { id: 5, name: 'ULM for Dummies' },
        { id: 6, name: 'Java for Dummies' },
        { id: 7, name: 'Learn Rust in 2 hours' },
    ]
}

const getRating = () => {
    return [
        { book_id: 1, client_id: 1, rating: 4.5 },
        { book_id: 1, client_id: 4, rating: 5 },
        { book_id: 1, client_id: 25, rating: 5 },
        { book_id: 1, client_id: 2112, rating: 4 },

        { book_id: 2, client_id: 34, rating: 3 },
        { book_id: 2, client_id: 123, rating: 4 },
        { book_id: 2, client_id: 23, rating: 4 },
        { book_id: 2, client_id: 255, rating: 4 },

        { book_id: 3, client_id: 98, rating: 2 },
        { book_id: 3, client_id: 45, rating: 1 },
        { book_id: 3, client_id: 223, rating: 3 },
        { book_id: 3, client_id: 213, rating: 1.5 },

        { book_id: 4, client_id: 652, rating: 4.5 },
        { book_id: 4, client_id: 42, rating: 4.5 },
        { book_id: 4, client_id: 562, rating: 4.5 },

        { book_id: 5, client_id: 2, rating: 5 },
        { book_id: 5, client_id: 2, rating: 5 },
        { book_id: 5, client_id: 2, rating: 5 },

        { book_id: 6, client_id: 2, rating: 4.5 },
        { book_id: 6, client_id: 2, rating: 4.5 },
        { book_id: 6, client_id: 2, rating: 4.5 },

        { book_id: 7, client_id: 2, rating: 4.5 },
        { book_id: 7, client_id: 2, rating: 4.5 },
        { book_id: 7, client_id: 2, rating: 4.5 },
        { book_id: 7, client_id: 2, rating: 4.5 },
        { book_id: 7, client_id: 2, rating: 4.5 },
    ]
}


const getBooksWithRatings = () => {
    return getBooks().map(book => {
        const ratings = getRating().filter((r) => r.book_id === book.id);
        return {...book, average: ratings.reduce((acc,{rating})=>acc rating, 0) / ratings.length};
    });

};

console.log(getBooksWithRatings())