#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())