groupBy的组数组

时间:2017-01-31 21:40:05

标签: javascript angularjs arrays ionic-framework mapreduce

我正在使用此函数对数组进行分组:

Array.prototype.groupBy = function(prop) {
          return this.reduce(function(groups, item) {
            var val = item[prop];
            groups[val] = groups[val] || [];
            groups[val].push(item);
            return groups;
          }, {});
        }

我在另一个获得日期的函数中使用它

    vm.parkings.forEach(function(value, key) {
        value.receiptsByDate = [];
        if (value.receipts != undefined) {
            value.receipts.forEach(function(rcpts) {
                    var date = rcpts.date.split('/');
                    var newDate = date[2] + '/' + date[0];
                    var year = date[2];
                    var month = date[0];
                    var price = rcpts.value;
                    value.receiptsByDate.push({newDate, price, month, year});
                    value.newReceipt = value.receiptsByDate.groupBy('month');
            })
        }
    })

结果:

Result

在我的newReceipt中,我按月分类对象,确定。

我想根据月份来计算价格。 示例:在数组内部三,访问对象并汇总价格。

这是最好的方法吗?

修改

我使用了下划线并且它正在工作。它看起来像这样:

var result = _.groupBy(receiptsByDate, "month");
var out = _(result).map(function(g, key) {
    return {month: key, price: _(g).reduce(function(m, x){return m + x.price}, 0)}
})

1 个答案:

答案 0 :(得分:0)

试试linq.js库:

var res = Enumerable.From([
  {date: new Date(), price: 10},
  {date: new Date(), price: 20},
  {date: new Date(2014, 15, 4), price: 30},
  {date: new Date(2014, 15, 4), price: 40},
  {date: new Date(2014, 15, 4), price: 50}
]).GroupBy("$.date.getMonth() + 1", null, function (key, gr) {
     var temp = {
           month: key,
           totalPrice: gr.Sum("$.price")
     };
     console.log(temp);
     return temp;
}).ToArray();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://neue.cc/linq.min.js"></script>