我从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 。
答案 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
}