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.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です。

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

必要なものを取得するには、上記で定義した関数を呼び出す必要があります。dataパラメーターはjson変数であり、パラメーターmonthは結果を取得する月のインデックスです。

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

編集2:逆シリアル化されたjsonオブジェクトのnullアイテムの場合の保護...

$.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

これを試して:

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

最も簡単な解決策は、当然のことだと思いますが、正規表現を使用することです。

この関数はテストを実行します。

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"関数呼び出しのを別の月に置き換え続けることができます。

于 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

これは単なるtechfoobarソリューションであるため、彼は称賛に値します。タイプミス(mYではなくmy)が原因で機能しませんでした。これはあなたの問題に適用される完全なリストです。

これ(= his)は、受け入れられたソリューションよりもはるかに優れたソリューションであることに注意してください。合計は、jsonを再度分割するのではなく、解析中に作成されるためです(すべてのjsonを読み取り、1つの変数にマージし、再度分割して計算します。合計はすべて役に立たない作業です)。

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

}

関数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

}

于 2012-11-20T07:38:07.110 に答える