在javascript中操作对象数据的数组

时间:2018-05-18 02:22:49

标签: javascript arrays node.js object reduce

所以我有一组数据让我们说......

    {'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 :(得分:0)

您发布的代码存在一些问题,最明显的是您在对象和数组之间感到困惑(假设),给定您想要的输出。

以下内容可以满足您的需求,并通过评论对其进行注释,以概述正在发生的事情。

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);