javascript - 使用 reduce 并向结果对象添加另一个值
问题描述
书籍数组中的对象示例:
const books = [
{
id: "5f447132d487bd81da01e25e",
title: "sit eiusmod occaecat eu magna",
genre: "Science",
authorId: 8,
borrows: [
{
id: "5f446f2e2cfa3e1d234679b9",
returned: false,
},
{
id: "5f446f2ed3609b719568a415",
returned: true,
},
{
id: "5f446f2e1c71888e2233621e",
returned: true,
},
{
id: "5f446f2e6059326d9feb9a68",
returned: true,
},
{
id: "5f446f2ede05a0b1e3394d8b",
returned: true,
},
{
id: "5f446f2e4081699cdc6a2735",
returned: true,
},
{
id: "5f446f2e3900dfec59489477",
returned: true,
},
{
id: "5f446f2e6059326d9feb9a68",
returned: true,
},
{
id: "5f446f2e409f8883af2955dd",
returned: true,
},
{
id: "5f446f2e3900dfec59489477",
returned: true,
},
{
id: "5f446f2eae901a82e0259947",
returned: true,
},
{
id: "5f446f2ef2ab5f5a9f60c4f2",
returned: true,
},
{
id: "5f446f2ea6b68cf6f85f6e28",
returned: true,
},
{
id: "5f446f2eed18105706d6ca19",
returned: true,
},
{
id: "5f446f2eae901a82e0259947",
returned: true,
},
{
id: "5f446f2e91c2af00cb74e82b",
returned: true,
},
{
id: "5f446f2e5aa2bb5545a0f8a6",
returned: true,
},
{
id: "5f446f2ea508b6a99c3e42c6",
returned: true,
},
{
id: "5f446f2e50cc2da9cd80efdb",
returned: true,
},
{
id: "5f446f2e0b3e2ff72fc503e7",
returned: true,
},
{
id: "5f446f2e91c2af00cb74e82b",
returned: true,
},
{
id: "5f446f2ef795e593cd3cd19d",
returned: true,
},
{
id: "5f446f2e2f35653fa80bf490",
returned: true,
},
{
id: "5f446f2e7b9cd304fed3a8bc",
returned: true,
},
{
id: "5f446f2ed9aac23c0340aab2",
returned: true,
},
],
},
我需要我的函数getMostCommonGenres(books)
:返回一个包含五个或更少对象的数组,这些对象代表最常见的流派,从最常见到最少排序,如下所示:(如果存在超过五本书,则只应返回前五名。)
getMostCommonGenres(books);
[
{ name: "Nonfiction", count: 9 },
{ name: "Historical Fiction", count: 7 },
{ name: "Thriller", count: 7 },
...
]
这是我到目前为止所拥有的:
function getMostCommonGenres(books) {
const genreArray = books.reduce((acc, book) => {
acc[book.name] = book.genre;
return acc;
}, {});
}
我很确定除了流派之后的“计数”值之外,我已经得到了我需要的一切。我不确定如何将它添加到对象中。我也不确定如何阻止前五名的计数。我刚刚完成了课程中的高级功能部分,所以我应该使用 forEach、find、filter、some、every、reduce 或 sort。我也不允许使用单字母变量。提前感谢您的任何帮助。
解决方案
我得到的答案似乎没有用,但这对我有用:
function getMostCommonGenres(books) {
const bookGenres = books.map((book) => book.genre);
const temp = [];
//map over book genres
bookGenres.map((genre) => {
//for each genre, first check to see if genre already exists in array
const genreLocation = temp.findIndex((element) => element.name === genre);
//second, if it exists, increase count by 1
if (genreLocation >= 0) {
temp[genreLocation].count = temp[genreLocation].count + 1;
//else, if it don't exist, push a new genre object onto array with count of 1
} else {
temp.push({ name: genre, count: 1 });
}
});
temp.sort((a, b) => b.count - a.count);
if (temp.length > 5) {
return temp.slice(0, 5);
}
return temp;
}
推荐阅读
- c - Scanf 使 do_while 循环卡住
- java - Java - [SQLITE_BUSY] 数据库文件被锁定(数据库被锁定)
- html - 删除gridview上的重复行
- php - 如何摆脱未定义的偏移量
- matlab - 交换矩阵的片段 Matlab
- android - 如何使来自互联网的图像响应 Android 布局?
- c# - 获取 HTTP 错误 500.30 - PhysicalFileProvider
- python - 在 Jupyter Notebook 上使用 Julia 出现内核错误
- logging - 如何在 F# 中使用 ZeroLog?
- c - 如何从 C 中的 SSL/ssl_st 结构中获取远程/对等 IP 地址?