5

我从 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.3. 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 / -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 / 1 -2012 125.83 / 18-09-2012 109.38

继续前进。

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

日期格式为 dd-mm-yyyy

4

9 回答 9

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"

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

演示: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

于 2012-11-21T18:58:18.907 回答
2

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

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

// 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;
}

要得到你想要的,你必须调用上面定义的函数。参数是你的datajson 变量,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);
        }
    }
});
于 2012-11-19T17:36:55.313 回答
0

这只是 techfoobar 的解决方案,所以他值得称赞。仅仅因为拼写错误(我的而不是我的),它不起作用。这是适用于您的问题的完整列表。

请注意,这个 (=his) 是一个比公认的更好的解决方案,因为总和是在解析 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"))
于 2012-11-28T12:16:14.380 回答
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);
于 2012-11-19T17:31:15.993 回答
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]);
       }
    }

这很丑陋,但我认为您可以理解。这是简单的字符串解析。

于 2012-11-19T17:31:55.133 回答
0

The simplest solution, and I would think obvious one, is to use Regular Expressions.

This function will do the test:

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;
    }
}

And then in your existing code:

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);
}

You can keep replacing the "09" in the function call with different months.

于 2012-11-21T15:47:30.210 回答
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;
    }

对于完整的解决方案检查这个小提琴

于 2012-11-25T18:57:15.450 回答
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));

}
于 2012-11-28T16:48:42.667 回答
-1

if (jsontext == '[]') { return 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);

}

函数解析日期(输入){

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

}

于 2012-11-20T07:38:07.110 回答