【问题标题】:Merge the total amount month wise每月合并总金额
【发布时间】:2017-12-19 07:07:53
【问题描述】:

我正在以表格形式获取数据。现在我需要合并同月的数据。显示如下表。请帮我解决一下这个。提前致谢 例如:当前表格是这样的

Month | Total Amount
Jan   | 100
Jan   | 100
Mar   | 200
Apr   | 300
Apr   | 200

我希望输出像

 Month | Total Amount
    Jan   | 200
    Mar   | 200
    Apr   | 500

代码如下:

    success: function (data) {
        if (data.length > 0) {

            var tr;
            var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

            for (var i = 0; i < data.length; i++) {

                var date = new Date(data[i].CompDt);

                var month = monthNames[date.getMonth()];
                var total = 0;
                var totalamt = data[i].TotalAmt;
                tr = $('<tr/>');
                tr.append("<td>" + month + "</td>");
                tr.append("<td>" + totalamt + "</td>");
                $('#GraphTable').append(tr);
            }

            var total = 0;
            for (var i = 0; i < data.length; i++) {
                total = total + data[i].TotalAmt;
            }
            $('#GraphTable').append('<tr style="font-weight: bold; background-color: white"><td colspan="2" align="right">Total: </td><td>' + total + '</td></tr>');
            tr = $('<tr style="font-weight: bold; background-color: white" />');
            tr.append("<td></td>");
            tr.append("<td></td>");


            $('#GraphTable').append(tr);

        }
        else {

            tr = $('<tr/>');
            tr.append("<th colspan='10' style='text-align:center'>No Data to display</th>");

            $('#GraphTable').append(tr);
        }

    } //end of success
});

【问题讨论】:

  • 你的数据是什么?
  • 如果可能,我强烈建议在您从 AJAX 请求调用的服务器端代码中修复此问题。
  • @beginner ...我同意 Rory 的最佳解决方案,但可能存在您无法在服务端代码编辑的情况,在这种情况下,我们需要示例 ajax 响应来帮助您出去。我再说一次,如果可以更改服务器端代码,那么我将使用 Rory 的声明。
  • 大家好,我无法在服务器端编辑数据。我们可以试试ajax本身吗?这里的数据是“完成日期和每个完成日期的总金额”通过完成日期我得到了月份。

标签: jquery html angularjs json


【解决方案1】:

成功更新下面的代码。

success: function (data) {
    if (data.length > 0) {

        var tr;
        var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

        var monthsAmt = [0,0,0,0,0,0,0,0,0,0,0,0];

        for (var i = 0; i < data.length; i++) {
            var date = new Date(data[i].CompDt);
            var monthIdx = monthsAmt[date.getMonth()];
            monthsAmt[monthIdx] += data[i].TotalAmt;
        }

        for(var i =0;i<12;i++){
        if(monthsAmt[i])
            tr = $('<tr/>');
            tr.append("<td>" +monthNames[i] + "</td>");
            tr.append("<td>" + monthsAmt[i] + "</td>");
            $('#GraphTable').append(tr);
          }
        }
        var total = 0;
        for (var i = 0; i < data.length; i++) {
            total = total + data[i].TotalAmt;
        }
        $('#GraphTable').append('<tr style="font-weight: bold; background-color: white"><td colspan="2" align="right">Total: </td><td>' + total + '</td></tr>');
        tr = $('<tr style="font-weight: bold; background-color: white" />');
        tr.append("<td></td>");
        tr.append("<td></td>");


        $('#GraphTable').append(tr);

    }
    else {

        tr = $('<tr/>');
        tr.append("<th colspan='10' style='text-align:center'>No Data to display</th>");

        $('#GraphTable').append(tr);
      }
    } //end of success
});

【讨论】:

  • 您好,我试用了您的代码。它将所有金额加起来并显示为一月。不工作
  • @beginner 你能分享你的小提琴吗?
  • 您好,我已经对代码进行了一些更改,现在可以使用了。检查我将发布的答案。我要为你的答案投票。谢谢:)
【解决方案2】:

这可能有效:

var result=[];

        success: function (data) {
                if (data.length > 0) {

                    var tr;
                    var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

                    for (var i = 0; i < data.length; i++) {
                        var totalAmt=0;
                         if(data[i].CompDt==data[i+1].CompDt)
                         {  
                            totalAmt= data[i].totalamt+data[i+1].totalamt;
                            result.push({'Month':data[i].CompDt, 'TotalAmount':totalAmt})
                         }

            } //end of success
        });

【讨论】:

  • @beginner 我已经添加了if 条件。请根据结果数组更改下部
  • if(data[i].CompDt==data[i+1].CompDt) 并非每次都会在每个订单旁边出现月份。这样就行不通了
  • @yogendarji,根据问题,没有建议 jan 可以在三月之后来。它将永远井然有序。我们按顺序考虑所有月份。不能是 jan, mar ,jan
  • 那么Dec、Dec 的最后两条记录呢?会报错
【解决方案3】:

我通过以下方式找到了我的解决方案:

 var tr;
                    var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
                    var monthsAmt = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

                    for (var i = 0; i < data.length; i++) {
                        var date = new Date(data[i].CompDt);
                        var monthIdx = monthNames[date.getMonth()];

                        switch(monthIdx)
                        {
                            case "Jan": monthsAmt[0] += data[i].TotalAmt;
                                break;

                            case "Feb": monthsAmt[1] += data[i].TotalAmt;
                                break;

                            case "Mar": monthsAmt[2] += data[i].TotalAmt;
                                break;

                            case "Apr": monthsAmt[3] += data[i].TotalAmt;
                                break;

                            case "May": monthsAmt[4] += data[i].TotalAmt;
                                break;

                            case "Jun": monthsAmt[5] += data[i].TotalAmt;
                                break;

                            case "Jul": monthsAmt[6] += data[i].TotalAmt;
                                break;

                            case "Aug": monthsAmt[7] += data[i].TotalAmt;
                                break;

                            case "Sep": monthsAmt[8] += data[i].TotalAmt;
                                break;

                            case "Oct": monthsAmt[9] += data[i].TotalAmt;
                                break;

                            case "Nov": monthsAmt[10] += data[i].TotalAmt;
                                break;

                            case "Dec": monthsAmt[11] += data[i].TotalAmt;
                                break;
                        }

                    }
                    for(var i =0;i<12;i++){
                        if(monthsAmt[i])
                            {
                            tr = $('<tr/>');
                        tr.append("<td>" +monthNames[i] + "</td>");
                        tr.append("<td>" + monthsAmt[i] + "</td>");
                        $('#GraphTable').append(tr);
                    }
                }

【讨论】: