比链接_.groupBy更好的方法?

时间:2015-07-09 17:04:55

标签: javascript arrays date underscore.js

当我这样做时,我得到一个数组,存储数据按日期的月份和日期分组,而不是按年份(我这样做是为了获得每天有数据的最大值,最小值和平均值对)

问题是数组在日期内存储了2-3个值的数组,这是关键值。这2-3个索引每个都有一个长度为1的数组,它包含对象的引用,该对象具有我需要的实际数据点(级别)。该对象包含三个属性,date,id(始终为null)和level为float。

我要么找到一种方法,这样2-3个索引直接保存对象,或找到_.each可以访问该级别的方式。

有什么想法吗?

var groupedData = _.groupBy(data, "date");

var groupedLevels = _.groupBy(groupedData, function (points, date) {
  var dateParsed = parseDate(date);
  var month = dateParsed.getMonth();
  var day = dateParsed.getDate();

  var monthDay = month + "-" + day; 
  return monthDay;
});

_.each(groupedLevels, function (points, date) {
  var levels = _.map(_.pluck(points, "level"), parseFloat);

  minimum.push([ date, R.min(levels) ]);
  maximum.push([ date, R.max(levels);

  var averageLevel = R.sum(levels) / levels.length;

  average.push([date, averageLevel]);
})

因此,原始输入的数据就像这样(样本片段):

[ { date: "2009-01-01",
    id: null,
    level: "0.08",
  },
  // ...
]

目前,groupedData是这样的:

{ "2009-01-01":
  [ { date: "2009-01-01",
      id: null,
      level: "0.08"
    }
  ],
  // ...
}

groupedLevels看起来像这样,例如:

{ "0-1":
  [ [ { date: "2009-01-01".
        id: null,
        level: "0.08"
      }
    ],
    // ...
  ],
  // ...
}

我想跳过所有长度为1的数组,并将对象存储在那里。

1 个答案:

答案 0 :(得分:0)

认为你可以通过替换这一行来解决这个问题:

var levels = _.map(_.pluck(points, "level"), parseFloat);

有了这个:

var levels = _.map(_.pluck(points[0], "level"), parseFloat);

...但我认为真正的问题可能是你在不需要的时候做了groupBy两次。这个单groupBy应该是等价的,但没有额外的嵌套数组:

var groupedLevels = _.groupBy(data, function(item) {
  var dateParsed = parseDate(item.date);
  var month = dateParsed.getMonth();
  var day = dateParsed.getDate();
  return month + '-' + day;
});

这样,您的each应该按预期工作。