Рассмотрим следующий список объектов:
const blogs = [
{
title: "React patterns",
author: "Michael Chan",
url: "https://reactpatterns.com/",
likes: 7,
},
{
title: "Go To Statement Considered Harmful",
author: "Edsger W. Dijkstra",
likes: 5,
},
{
title: "Canonical string reduction",
author: "Edsger W. Dijkstra",
likes: 12,
},
{
title: "First class tests",
author: "Robert C. Martin",
likes: 10,
},
{
title: "TDD harms architecture",
author: "Robert C. Martin",
likes: 0,
},
{
title: "Type wars",
author: "Robert C. Martin",
likes: 2,
}
]
Что мне нужно сделать, это написать функцию, которая возвращает объект блога, с автором, у которого есть большинство блогов, которые он написал, в следующем формат (который также является ожидаемым результатом в этом случае):
{
author: "Robert C. Martin",
blogs: 3
}
Это первое решение, которое я придумала, включающее 2 редуктора
const mostBlogs = blogs => {
const formatted_blogs = blogs.reduce((acc, cur_blog)=>{
if (!acc[cur_blog.author]){
acc[cur_blog.author] = {
author: cur_blog.author, blogs: 1
}
} else {
acc[cur_blog.author].blogs++;
}
return acc;
}, {});
return Object.keys(formatted_blogs).reduce((acc, cur)=>{
if (formatted_blogs[cur].blogs > (acc.blogs||0))
return ( {...formatted_blogs[cur]} )
return acc;
}, {});
}
Мне было интересно, как я могу сделать это лучше, используя только один редуктор, который был бы более эффективным и умным. Пока я набирал вопрос здесь, я фактически нашел другое решение, использующее только 1 редуктор. Хотелось бы услышать ваше мнение об этом, можно ли это оптимизировать? Это достаточно умный / эффективный? или я могу сделать что-то другое, что было бы лучше?
const mostBlogs = blogs => {
const { most_blogs } = blogs.reduce((acc, cur_blog)=>{
// if author doesn't exist in acc.all, add a new formatted obj
if (!acc.all[cur_blog.author])
acc.all[cur_blog.author] = { author: cur_blog.author, blogs: 1 };
// if exists, simply increment the blogs prop count in acc.all
else
acc.all[cur_blog.author].blogs++;
// check if cur_blog blogs prop in acc.all is higher than
// existing one in acc.most_blogs blogs prop, overwrite obj if so
if (acc.all[cur_blog.author].blogs > (acc.most_blogs.blogs||0))
acc.most_blogs = acc.all[cur_blog.author];
return acc;
}, {all: {}, most_blogs: {} });
return most_blogs;
}