我正在尝试使用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",
}
]
我想要摆脱的是图表上每月的销售额。到目前为止,我已经能够预测月份和总销售额,但不是每个特定月份的销售量。
答案 0 :(得分:1)
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;
}, {});