Найти человека с наибольшим количеством блогов в массиве объектов - PullRequest
4 голосов
/ 11 июля 2019

У меня есть массив объектов блога, как мне найти автора с наибольшим количеством лайков?

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

const blogs = [
  {
    title: 'First',
    author: 'Jane',
    likes: 4,
  },
  {
    title: 'Second',
    author: 'Joe',
    likes: 1,
  },
  {
    title: 'Third',
    author: 'Jane',
    likes: 7,
  },
  {
    title: 'Fourth',
    author: 'Jack',
    likes: 1,
  },
  {
    title: 'Fifth',
    author: 'Joe',
    likes: 5,
  }
]

Количество авторов не ограничено, и в этом примере результат должен быть примерно таким:

{
    author: 'Jane',
    likes: 11,
  }

Ответы [ 3 ]

12 голосов
/ 11 июля 2019

Вы можете использовать уменьшить, отобразить каждого автора на объекте и добавить это как

const blogs = [ { title: 'First', author: 'Jane', likes: 4, }, { title: 'Second', author: 'Joe', likes: 1, }, { title: 'Third', author: 'Jane', likes: 7, }, { title: 'Fourth', author: 'Jack', likes: 1, }, { title: 'Fourth', author: 'Joe', likes: 5, } ]

let authorLikes = blogs.reduce((op, {author, likes}) => {
  op[author] = op[author] || 0
  op[author] += likes
  return op
},{})

console.log(authorLikes)

Вы можете расширить его, чтобы получить наибольшее количество лайков

// to find most likes
let mostLikes = Object.keys(authorLikes).sort((a,b)=> authorLikes[b] - authorLikes[a])[0]

console.log(mostLikes, authorLikes[mostLikes])
3 голосов
/ 11 июля 2019

Если вы искали только автора с наибольшим количеством лайков, вы можете сделать это за один проход с помощью .reduce () .

Приведенный ниже метод отслеживает общее количество лайков авторов (sums) и отдельного автора с наибольшим количеством (most) для одновременного суммирования и сравнения.

const blogs = [ { title: 'First', author: 'Jane', likes: 4, }, { title: 'Second', author: 'Joe', likes: 1, }, { title: 'Third', author: 'Jane', likes: 7, }, { title: 'Fourth', author: 'Jack', likes: 1, }, { title: 'Fourth', author: 'Joe', likes: 5, } ];

const getMostLikes = (blogs) => blogs
  .reduce(({sums,most}, {likes, author}) => {
    sums[author] = likes = (sums[author] || 0) + likes;
    if (likes > most.likes) most = {author,likes};
    return {sums,most};
  }, {sums: {}, most: {likes:0} })
  .most;

console.log( getMostLikes(blogs) );

* Благодаря ответу CodeManiac я сократил создание / добавление с использованием out.sums[author] || 0.

0 голосов
/ 11 июля 2019
const mostLiked = blogs.reduce((accumulator, currentValue, index) => {
  if (index === 0) {
    return currentValue;
  }
  return accumulator.likes > currentValue.likes ? accumulator : currentValue;
});

Подобное решение, хотя я считаю, что это легче рассуждать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...