在 javascript 中使用 map reduce
Using map reduce in javascript
我正在尝试使用 mapreduce 来计算每月销售额,并在稍后使用 chart.js 绘制图表。
假设我有一个包含字段、金额和日期的 JSON 响应。
对于我的地图功能,我取出了月份:
month = _.map([items[i].transactionDate], function(date) {
return {
lables: items[i].transactionDate.slice(5,7)
};
});
还有我的 reduce 函数……好吧,我不知道该做什么。
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",
}
]
我想从中得到的是图表上的每月销售额。到目前为止,我已经能够预测月份和总销售额,但不能预测每个特定月份的销售额。
map
and reduce
是 Array 的函数,可以为您遍历数组
map
returns 一个新数组,其中包含每个元素的映射函数结果
var months = items.map ( item => item.transactionDate.slice(5,7) )
和reduce
将归约函数应用于每个元素和一个累加器。
var sum = items.reduce( (accum, item) => accum + item.amt , 0);
我认为,只需添加一个新变量就可以循环
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"];
我假设 items[i]
是一个对象,它具有 .transactionsDate
和 .amt
作为具有相应索引的两个数组。如果是这样,您可以从 { totalSales, months }
.
开始,在一个 reduce
函数中获得每月销售额和总销售额
var chartData = items[i].transactionDate.reduce(function(total, month, index) {
var monthlyData = {
label: month.slice(5, 7),
sales: items[i].amt[index]
};
total.months.push(monthlyData);
total.totalSales += item.amt;
return total;
}, {
totalSales: 0, months: []
});
// get total sales
var totalSales = chartData.totalSales;
// get sales for May starting at index 0
var salesForMay = chartdata.months[4];
如果这就是您要找的,请告诉我。
我知道这是旧的,但这里是如何将 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;
}, {});
我正在尝试使用 mapreduce 来计算每月销售额,并在稍后使用 chart.js 绘制图表。
假设我有一个包含字段、金额和日期的 JSON 响应。
对于我的地图功能,我取出了月份:
month = _.map([items[i].transactionDate], function(date) {
return {
lables: items[i].transactionDate.slice(5,7)
};
});
还有我的 reduce 函数……好吧,我不知道该做什么。
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",
}
]
我想从中得到的是图表上的每月销售额。到目前为止,我已经能够预测月份和总销售额,但不能预测每个特定月份的销售额。
map
and reduce
是 Array 的函数,可以为您遍历数组
map
returns 一个新数组,其中包含每个元素的映射函数结果
var months = items.map ( item => item.transactionDate.slice(5,7) )
和reduce
将归约函数应用于每个元素和一个累加器。
var sum = items.reduce( (accum, item) => accum + item.amt , 0);
我认为,只需添加一个新变量就可以循环
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"];
我假设 items[i]
是一个对象,它具有 .transactionsDate
和 .amt
作为具有相应索引的两个数组。如果是这样,您可以从 { totalSales, months }
.
reduce
函数中获得每月销售额和总销售额
var chartData = items[i].transactionDate.reduce(function(total, month, index) {
var monthlyData = {
label: month.slice(5, 7),
sales: items[i].amt[index]
};
total.months.push(monthlyData);
total.totalSales += item.amt;
return total;
}, {
totalSales: 0, months: []
});
// get total sales
var totalSales = chartData.totalSales;
// get sales for May starting at index 0
var salesForMay = chartdata.months[4];
如果这就是您要找的,请告诉我。
我知道这是旧的,但这里是如何将 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;
}, {});