jQuery:附加特定日期的所有数据的总和

时间:2012-11-19 17:14:19

标签: jquery json sum

我从API中检索了一些数据并将其添加为:

if (jsontext == '[]') {
    return false
} else {

    var newTr = '';
    for (var i = 0; i < json.length; i++) {
        newTr += (' / ' + json[i].date + ' ' + json[i].price);

    }

    console.log(newTr);

}

这给了我一个巨大的结果列表:

/ 07-09-2012 72.60 / 11-09-2012 194.98 / 03-09-2012 94.82 / 04-09-2012 187.56 / 31-10-2012 72 / 18-09-2012 204.75 / 26 -09-2012 243.73 / 14-09-2012 86.40 / 20-09-2012 91.63 / 28-09-2012 96.56 / 01-09-2012 94.62 / 17-09-2012 94.86 / 17-09-2012 83.25 / 12- 09-2012 94.85 / 18-09-2012 94.86 / 18-09-2012 68.74 / 21-09-2012 94.86 / 21-09-2012 94.86 / 24-09-2012 144.23 / 28-09-2012 92.77 / 30-09 -2012 92.77 / 28-09-2012 92.77 / 13-09-2012 151.12 / 03-09-2012 125.80 / 05-09-2012 92.61 / 05-09-2012 95.54 / 12-09-2012 94.59 / 12-09- 2012 94.59 / 13-09-2012 125.83 / 18-09-2012 109.38

并继续前进。

如何获取09月的定价总和?

日期格式为dd-mm-yyyy

9 个答案:

答案 0 :(得分:4)

我认为你拥有的是一个如下所示的字符串,

"/ 07-09-2012 72.60 / 11-09-2012 194.98 / 03-09-2012 94.82 / 04-09-2012 187.56 / 31-10-2012 72 / 18-09-2012 204.75 / 26-09-2012 243.73 / 14-09-2012 86.40 / 20-09-2012 91.63 / 28-09-2012 96.56 / 01-09-2012 94.62 / 17-09-2012 94.86 / 17-09-2012 83.25 / 12-09-2012 94.85 / 18-09-2012 94.86 / 18-09-2012 68.74 / 21-09-2012 94.86 / 21-09-2012 94.86 / 24-09-2012 144.23 / 28-09-2012 92.77 / 30-09-2012 92.77 / 28-09-2012 92.77 / 13-09-2012 151.12 / 03-09-2012 125.80 / 05-09-2012 92.61 / 05-09-2012 95.54 / 12-09-2012 94.59 / 12-09-2012 94.59 / 13-09-2012 125.83 / 18-09-2012 109.38"

如果是这种情况,则需要解析字符串以按月计算总和。

DEMO: http://jsfiddle.net/pBNNt/

完整代码:

var resultArr = result.split('/');
var results = {}; //sum by month
for (var i = 0; i < resultArr.length; i++) {    
    if ( resultArr[i].length >= 11) { //it has date
        var resultTkn = resultArr[i].split(' ');

        if (resultTkn[1].length == 10) { //it is a date
            var date = resultTkn[1].split('-');
            var sum = 0;
            if (results.hasOwnProperty(date[1])) {
                sum = results[date[1]];
            }

            sum += parseFloat(resultTkn[2]);
            results[date[1]] = sum;
        }
    }
}

现在,您可以使用结果对象按月访问总和。 results["09"]已返回3305.93

答案 1 :(得分:2)

编辑:我试图根据评论尽可能清楚地解释这一点:

首先,您需要添加函数,该函数负责解析日期字符串(格式为dd-mm-yyyy的input参数),并返回正确的日期对象:

// parse a date in dd-mm-yyyy
function parseDate(input) {
    var parts = input.match(/(\d+)/g);
    // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
    return new Date(parts[2], parts[1] - 1, parts[0]); // months are 0-based
}

在执行了您所询问的写功能之后 - 返回提供月份的价格总和:

// get sum of prices for given month
function getSumForMonth(data, month) {
    var sum = 0;
    month -= 1; // months are 0-based 
    $.each(data, function (idx, item) {
        if (parseDate(item.date).getMonth() == month) {
            sum += parseFloat(item.price);
        }
    });
    return sum;
}

要获得您想要的内容,您必须调用上面定义的函数。 data参数是您的json变量,month参数是您希望获得结果的月份的索引:

var sum = getSumForMonth(json, 9); // sum for september
console.log(sum);

编辑2:在反序列化的json对象中为空项保护...

$.each(data, function(idx, item) {
    if (item != null && item.date != null && item.price != null) {
        if (parseDate(item.date).getMonth() == month) {
            sum += parseFloat(item.price);
        }
    }
});

答案 2 :(得分:0)

试试这个:

// declare before looping through your JSON
var sums = [];

...
newTr += (' / ' + json[i].date + ' ' + json[i].price);
...

// month-year
var mY = json[i].date.split('-');

/* EDIT: changed my to mY */
mY = mY[1] + '-' + mY[2];


// this will give you an array with sums for each month
sums[mY] == undefined ? sums[mY] = parseFloat(json[i].price) : sums[mY] += parseFloat(json[i].price);

答案 3 :(得分:0)

这是一个快速摘录:

    var string_array = yourStringLine.split("/");
    var length = string_array.length;
    var sum = 0;
    for(var y = 0; y < length; y++) {
       var date_data = string_array[y].split(" ");
       var month = date_data[0].split("-")[1];
       if(month == "09") {
            sum += parseFloat(date_data[1]);
       }
    }

这很难看,但我认为你可以理解。这是简单的字符串解析。

答案 4 :(得分:0)

最简单的解决方案,我认为很明显,就是使用正则表达式。

此功能将进行测试:

function forGivenMonth(month, input){
    var custom_regex = "[0-9]{2}-" + month + "-[0-9]{4}"
    var regex = new RegExp(custom_regex);
    if(regex.test(input)) {
      return true;
    } else {
      return false;
    }
}

然后在您现有的代码中:

if (jsontext == '[]') {
    return false
} else {
    var sum = 0;
    for (var i = 0; i < json.length; i++) {
        if(forGivenMonth("09", json[i].date){
            sum += json[i].price;
        }
    }
    console.log(sum);
}

您可以用不同的月份继续替换函数调用中的"09"

答案 5 :(得分:0)

我会说避免字符串拆分会更好,因为它会表现不佳,并且会选择基于正则表达式的解决方案。虽然已有这样的答案,但我认为有更好的方法可以做到这一点(一如既往,可能有比这更好的方法)

这里我写了一个函数,它可以接受源,月和年并返回总和。我避免使用拆分功能。

   function(source, month, year) {
        var rexp = new RegExp("/\\s+\\d{2}-" + month + "-" + year + "\\s+(\\d+\\.\\d+)\\s+", "g");

        var tot = 0;
        var m = rexp.exec(source);
        while (m) {
            var n = new Number(m[1]);
            tot += (n || 0.0)
            // This is only for debugging purposes
            $("#container").append($('<span>').text(" Found match : " + m[0] + ", Number => " + m[1] + ", Total => " + tot.toString())).append($('<br />'));

            m = rexp.exec(source);
        }

        return tot;
    }

有关完整解决方案,请查看此fiddle

答案 6 :(得分:0)

这只是techfoobar解决方案,因此值得信赖。它只是因为一个错字(我而不是mY)而无效。这是完整列表,适用于您的问题。

请注意,这个(=他的)是一个比接受的更好的解决方案,因为总和是在解析json时创建的,而不是再次拆分它(读取所有json,将其合并到一个var中,再次拆分)计算总和是无用的工作)。

var sums = [];

if (jsontext == '[]') {
    return false
} else {

    var mY;
    var newTr = '';
    for (var i = 0; i < json.length; i++) {
        newTr += (' / ' + json[i].date + ' ' + json[i].price);
        mY = json[i].date.split('-');
        mY = mY[1] + '-' + mY[2];
        sums[mY] == undefined ? sums[mY] = parseFloat(json[i].price) : sums[mY] += parseFloat(json[i].price);
    }

    console.log(newTr);

}

function getMonthSum(y,m) {
    return sums[y+"-"+m];
}

alert(getMonthSum("2012","09"))

答案 7 :(得分:0)

// Testing Setup
var jsontext;
var json = [
    { date:"07-09-2012", price:"72.60"},
    { date:"11-09-2012", price:"194.98"},
    { date:"03-09-2012", price:"94.82"},
    { date:"04-09-2012", price:"187.560"},
    { date:"31-10-2012", price:"72"},
    { date:"18-09-2012", price:"204.75"},
    { date:"26-09-2012", price:"243.73"},
    { date:"14-09-2012", price:"86.40"},
    { date:"20-09-2012", price:"91.63"},
    { date:"28-09-2012", price:"96.56"},
    { date:"01-09-2012", price:"94.62"},
    { date:"17-09-2012", price:"94.86"},
    { date:"17-09-2012", price:"83.25"},
    { date:"12-09-2012", price:"94.85"},
    { date:"18-09-2012", price:"94.86"},
    { date:"18-09-2012", price:"68.74"},
    { date:"21-09-2012", price:"94.86"},
    { date:"21-09-2012", price:"94.86"},
    { date:"24-09-2012", price:"144.23"},
    { date:"28-09-2012", price:"92.77"},
    { date:"30-09-2012", price:"92.77"},
    { date:"28-09-2012", price:"92.77"},
    { date:"13-09-2012", price:"151.12"},
    { date:"03-09-2012", price:"125.80"},
    { date:"05-09-2012", price:"92.61"},
    { date:"05-09-2012", price:"95.54"},
    { date:"12-09-2012", price:"94.59"},
    { date:"12-09-2012", price:"94.59"},
    { date:"13-09-2012", price:"125.83"},
    { date:"18-09-2012", price:"109.38"}
];

//  New function
//
function sum( month, data ) {
    var sum = 0;
    $.each( data,function(i,val){
        var parts = val.date.split("-");
        if( parts.length==3 && parseInt(parts[1])==month ) {
            sum += parseFloat("0"+val.price);
        }
    });
    return sum;
}


// Your Code
//
if (jsontext == '[]') {
    return false
} else {

    var newTr = '';
    for (var i = 0; i < json.length; i++) {
        newTr += (' / ' + json[i].date + ' ' + json[i].price);

    }
    console.log(newTr);

    // !!!  THE CALL TO MY CODE !!!!
    console.log(sum(9,json));

}

答案 8 :(得分:-1)

if(jsontext =='[]'){     返回false } else {

var newTr = '';
var newmonth=0'';
var sum=0;  
for (var i = 0; i < json.length; i++) {
    newTr += (' / ' + json[i].date + ' ' + json[i].price);

newmonth=parseDate(json[i].date).getMonth();
if (parseDate(json[i].date).getMonth() <> newmonth)
{
  newmonth=parseDate(json[i].date).getMonth();
  newTr += (' / '+'Total for month '+ newmonth +' :'+sum);
  sum = 0;
}
    else
{
   sum+= parseFloat(json[i].price);
}

}

console.log(newTr);

}

function parseDate(input){

var parts = input.match(/(\d+)/g);
// new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
return new Date(parts[2], parts[1] - 1, parts[0]); // months are 0-based

}