在forEach循环中创建一个对象并将其推入一个数组

时间:2014-04-12 21:26:18

标签: javascript ember.js

我在forEach循环中创建对象。我尝试计算某一天的推文数量,将那些值添加到当天,然后将day / count对象推回到数组中。

我想要的结果是这样的:

[
  { 
    "date": "April 5th", 
    "tweets": 12
  },
  { 
    "date": "April 4th", 
    "tweets": 20
  }
]

我的代码:

App.TweetsController = Ember.ArrayController.extend({
  tweetFrequencies: function() {
    var self = this;
    var model = self.get('model');
    var tweetsHash = {};
    var tweetsArray = [];

    model.forEach(function(item) {

      var tweetFreq = {};
      var normalizedDate = moment(item.created_at).format( 'MMMM Do' );

      if ( tweetsHash[normalizedDate] === undefined ) {
        tweetsHash[normalizedDate] = { "Date": normalizedDate, "Tweets": 1 };
      } else {
        tweetsHash[normalizedDate]["Tweets"] += 1;
      }

      tweetFreq['tdate'] = tweetsHash[normalizedDate]["Date"];
      tweetFreq['tweets'] = tweetsHash[normalizedDate]["Tweets"];
      tweetsArray.push( tweetFreq );

    });

    return tweetsArray;

  }.property('model')
});

编辑:

Data I'm getting back

3 个答案:

答案 0 :(得分:2)

每次都不小心注入了新对象。您可以使用当前项目不存在的现有条件,然后仅插入。

App.TweetsController = Ember.ArrayController.extend({
  tweetFrequencies: function() {
    var self = this,
        model = this.get('model'),
        tweetsHash = {},
        tweetsArray = [];

    model.forEach(function(item) {

      var normalizedDate = moment(item.created_at).format( 'MMMM Do' );

      if ( tweetsHash[normalizedDate] === undefined ) {
        tweetsHash[normalizedDate] = { "Date": normalizedDate, "Tweets": 1 };
        tweetsArray.push( tweetsHash[normalizedDate] );
      } else {
        tweetsHash[normalizedDate]["Tweets"] += 1;
      }

    });

    return tweetsArray;

  }.property('model')
});

答案 1 :(得分:1)

看起来你的tweetFreq对象与你的tweetsHash相同......为什么不呢:

model.forEach(function(item) {

  var normalizedDate = moment(item.created_at).format( 'MMMM Do' );

  if ( tweetsHash[normalizedDate] === undefined ) {
    tweetsHash[normalizedDate] = { "Tweets": 1 };
  } else {
    tweetsHash[normalizedDate]["Tweets"] += 1;
  }

});

for (var i = 0; i < Object.keys(tweetsHash).length; i++) {
  var date = Object.keys(tweetsHash)[i];
  tweetsArray.push({"Date": date, "Tweets": tweetsHash[date]["Tweets"]});
}

return tweetsArray;

答案 2 :(得分:0)

好像你想要一次做两件事。我把它们分开了......我仍然不确定你为什么不一步完成它们并在第一个循环中修改最终数组去掉散列变量。可能有一个原因,因为它与你没有向我们展示的代码有关......所以我会这样做:

 model.forEach(function(item) {
      var normalizedDate = moment(item.created_at).format( 'MMMM Do' );

      if ( tweetsHash[normalizedDate] === undefined ) {
        tweetsHash[normalizedDate] = { "Date": normalizedDate, "Tweets": 1 };
      } else {
        tweetsHash[normalizedDate]["Tweets"] += 1;
      }
 });

 tweetsHash.forEach(function(item) {
      var tweetFreq = {};

      tweetFreq['tdate'] = item["Date"];
      tweetFreq['tweets'] = item["Tweets"];

      tweetsArray.push( tweetFreq );
 });

 return tweetsArray;