在javascript中使用map reduce

时间:2016-04-22 06:22:46

标签: javascript underscore.js chart.js

我正在尝试使用mapreduce计算月度销售额,并使用chart.js计算图表。

假设我有一个带有字段,数量和日期的JSON响应。

对于我的地图功能,我拿出月份:

 month = _.map([items[i].transactionDate], function(date) { 
     return {
         lables: items[i].transactionDate.slice(5,7)
     }; 
});

和我的减少功能......好吧我不知道该怎么做。

  sum = _.reduce([items[i].amt], function(memo, num) {
      return memo + items[i].amt
  });

我意识到这最终将计算总和不是每月。问题是我不知道如何正确地将这两个功能联系起来。

编辑:每个请求,我的JSON:

 "items": [
 {
"_id": "56d1cf3704aee3c68d89cc09",
"amt": 5,
"transactionDate": "2016-02-27T16:30:47.561Z",
 }
]

我想要摆脱的是图表上每月的销售额。到目前为止,我已经能够预测月份和总销售额,但不是每个特定月份的销售量。

4 个答案:

答案 0 :(得分:1)

mapreduce是Array的函数,可以为您迭代数组

map返回一个新数组,其中包含每个元素的映射函数的结果

var months = items.map ( item => item.transactionDate.slice(5,7) )

reduce将reduce函数应用于每个元素和累加器。

var sum = items.reduce( (accum, item) => accum + item.amt , 0);

答案 1 :(得分:1)

我认为,只需添加新变量

即可创建一个循环
let result= {};

_.forEach(items, (item) => {
    // get month
    let month = item.transactionDate.slice(5,7);
    // get amount
    let amount = item.amt;

    // check if we have this month in finaly object
    if(month in finaly) {
       // added amount
       result[month] += amount;
    } else {
       // if this month doesn't exist added with inital value
       result[month ] = amount;
    }
});

当你可以获得所有月份或获得所有月份的总和时

let allSum = _.reduce(result, (sum, amount) => sum += amount);
let amountInCertainMonth = result["01"];

答案 2 :(得分:0)

我认为{a: 1, b: 2} // Note that d is missing! 是一个对象,items[i].transactionsDate是两个具有相应索引的数组。如果是这样,您可以从.amt开始,将每月销售额和总销售额定在一个reduce内。

{ totalSales, months }

如果您正在寻找,请告诉我。

答案 3 :(得分:0)

我知道这很老,但是这里是如何将reduce作为一个分组使用

    var results = items
        .map(function(data){
            return {"month": data.transactionDate.slice(0,7), "amt": data.amt};
        })
        .reduce(function(amounts, data){            
            if (!amounts.hasOwnProperty(data.month))
                amounts[data.month] = data.amt;
            else
                amounts[data.month] = amounts[data.month] + data.amt;

            return amounts;
	
        }, {});