Управление массивом данных объекта в JavaScript - PullRequest
0 голосов
/ 18 мая 2018

Итак, у меня есть набор данных, скажем ...

    {'action': 'tweet', 'user': 'loser', 'message': 'fooboo'}
    {'action': 'follow', 'user': 'loser', 'message': null }
    {'action': 'tweet', 'user': 'loser', 'message': 'hello'}
    {'action': 'retweet', 'user': 'loser', 'message': null}
    {'action': 'tweet', 'user': 'michael', 'message': 'CIA is watching'}
    {'action': 'tweet', 'user': 'michael', 'message': 'HEHEHEHE'}
    {'action': 'follow', 'user': 'michael', 'message': null }

, и я пытаюсь выполнить итерацию по нему, используя команду Reduce, и возвращает список пользователей со счетом всех их действий, так чтопример

    { loser: 
            {
              tweets: 2
              retweets: 1
              follows: 1
            }
    }, michael:
            {
               tweets: 2
               retweets: 0
               follows: 1
            }
     }

Вот мой код ...

    let userCount = tweets.reduce(function(users, line, idx) {
       users[line['users']] = users[line['user']] || [];
       let action = line['action];

       users[line.user].push({
         action: users[line.user].action + 1 || 0
       })
      return users
    }, {users: []});

Мой код не успешно подсчитывает или вводит имена действий в качестве ключа к объекту.Вот как выглядят мои выходные данные.

    { michael: [ { action: 1 } ],
      loser: [ { action: 1 }, { action: 1 }, { action: 1 } ],
    }

1 Ответ

0 голосов
/ 18 мая 2018

Есть несколько проблем с кодом, который вы разместили, особенно в том, что вы путаетесь (я полагаю) между объектами и массивами, учитывая ваш желаемый результат.

Следующее достигает того, что вам нужно, и яаннотировал его комментариями, чтобы обрисовать в общих чертах происходящее.

var tweets = [
  {action: 'tweet', user: 'loser', message: 'fooboo'},
  {action: 'follow', user: 'loser', message: null },
  {action: 'tweet', user: 'loser', message: 'hello'},
  {action: 'retweet', user: 'loser', message: null},
  {action: 'tweet', user: 'michael', message: 'CIA is watching'},
  {action: 'tweet', user: 'michael', message: 'HEHEHEHE'},
  {action: 'follow', user: 'michael', message: null },
];

const users = tweets.reduce((users, tweet) => {
  // Deconstruct tweet to get user and action
  const {user, action} = tweet;
  
  // Add user to users list, if they don't already exist
  if (users[user] === undefined) users[user] = {};
  
  // Increment user action count
  users[user][action] = (users[user][action] || 0) + 1;
                            
  return users;
}, {});

console.log(users);
...