带条件的多维数组中的javascript和数组值

javascript sum array values in multidimensional array with conditions

本文关键字:数组 javascript 条件      更新时间:2024-04-18

我正试图使用javascript迭代一个对象,并将一个属性分组的值与另一个属性的值相加。以下是我正在迭代的示例数据:

63.450,     2013-01-01 00:00:00,    63.450,     2013,   Amex Residuals
3.980,      2013-01-01 00:00:00,    3.980,      2013,   Gift Cards on Demand
-16.000,    2013-01-01 00:00:00,    -16.000,    2013,   Month End Fee Rejects
67.140,     2013-02-01 00:00:00,    67.140,     2013,   Amex Residuals
-600.000,   2013-02-01 00:00:00,    -600.000,   2013,   Bonus Take Back - Closed Less Than 6 Months
-400.000,   2013-02-01 00:00:00,    -400.000,   2013,   Bonus Take Back - Did Not Activate
8.910,      2013-02-01 00:00:00,    8.910,      2013,   Checks On Demand
13997.770,  2013-02-01 00:00:00,    13997.770,  2013,   Global Report
-15.000,    2013-02-01 00:00:00,    -15.000,    2013,   Merchant Adjustments
-34.500,    2013-02-01 00:00:00,    -34.500,    2013,   Month End Fee Rejects

第二列数据继续包括其他月份(截至10月)。我需要将第一列中每个不同月份的所有值相加,并从第四列的年份创建一个javascript日期,因此结果应该是这样的:

var data = [ [Date.UTC('2013', i, 1), parseFloat('51.43')], [Date.UTC('2013', i, 1), parseFloat(13024.32)] ]; 

从本质上讲,我应该为每个月的总数提供一个2元素的数组,其中包含第4列中的日期对象。我只是不知道如何对第二列(日期)的条件分组进行迭代求和。

一般流程为:

  • 创建一个空物体来保存你的答案
  • 穿过每一行
    • 从第二个元素中提取月份和年份
    • 将值设置为0
    • 如果月和年已经在对象中,请将值设置为月和年的值
    • 将最新值添加到当前值
    • 将对象的月份和年份与值关联

在不知道你的确切结构的情况下,这里有一些半伪代码

var data = {}
for (var i = 0; i < lines.length; ++i) {
    var monthYear = lines[i][1].substring(0, 6);
    var value = 0;
    if (data[monthYear]) {
        value = data[monthYear];
    }
    value += +lines[i][0]; // unary + to make sure the value is a number, not a string
    data[monthYear] = value;
}

(显然,如果你有对象而不是数组,你可以适当地访问它们。)

基于@scottmermelstein的答案(我会接受,因为它导致了我这样做),我创建了以下内容,这给了我想要的结果:

 var objCalc    = {'unCalc':{}, 'reCalc':{}},
     objUnCalc  = {},
     objReCalc  = {},
     arrUnCalc  = [],
     arrReCalc  = [];
 //lets sum up the month totals first, and create the date object that is needed for the graph
 $.each(data.TableContainer, function(i,e){                      
    objCalc.unCalc[ e.ActualDate ] = ( objCalc.unCalc[ e.ActualDate ] ? objCalc.unCalc[ e.ActualDate ] + parseFloat(e.GrpTotal) : parseFloat(e.GrpTotal) );
    objCalc.reCalc[ e.ActualDate ] = ( objCalc.reCalc[ e.ActualDate ] ? objCalc.reCalc[ e.ActualDate ] + parseFloat(e.GrpBonusAmt) : parseFloat(e.GrpBonusAmt) );
 });
 //now we iterate over the summed values from above and push them to usable highcharts arrays
 $.each(objCalc, function(i,e){
        $.each(e, function(y,el){
            var arrDate     = y.substring(0,y.indexOf(' ')).split('-'), //renders something like ['2013','02','01']
                UTC         = Date.UTC(arrDate[0], parseInt(arrDate[1])-1, parseInt(arrDate[2])), //subtract 1 from month to make UTC date 0-based
                arr         = [ UTC, parseFloat( parseFloat( el ).toFixed( 2 ) ) ];
            if( i == "unCalc" ) arrUnCalc.push( arr );
            if( i == "reCalc" ) arrReCalc.push( arr );
        });
 });