在 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;
 
        }, {});