功能需求:展示产品的点击量和曝光量,然后用列表和图形展示。 PHP后台传送数据为[[{“date”:“9”,“count”:“1”,“m”:“27”},{“date”:“15”,“count”:“11”,“m”:“27”}…],[{“date”:“9”,“count”:“101”,“m”:“27”},{“date”:“15”,“count”:“201”,“m”:“27”}…]] date单位可以是时、某月中的某一日、某年中的某一月。cout单位是数量。m是数据库当前日期。 在ajax时候先做了下处理,得出moths数组,和count数组,两个数组之前是一一对应的数据关系,而现在就差两样,一个是没有排序,一个是可能数据中出现日期中断(比如3时没有点击量,7时没有曝光量)。 所以,现在功能函数: 排序、把空数据的填上0以及它当时的时间。 success: function(msg){
var months1=[],count1 = []; var months2=[],count2 = []; var mm1="",nn1=""; var mm2="",nn2=""; for(var i=msg[0].length-1;i>=0;i–){ months1.push(msg[0][i].date);
count1.push(msg[0][i].count);
count1[count1.length-1] = parseInt(count1[count1.length-1]);
} for(var i=msg[1].length-1;i>=0;i–){ months2.push(msg[1][i].date);
count2.push(msg[1][i].count);
count2[count2.length-1] = parseInt(count2[count2.length-1]);
} if(msg[0].length>0 || msg[1].length > 0){ var re1 = fullM(months1,count1,msg[0].length>0 ? msg[0][0].m:msg[1][0].m); var re2 = fullM(months2,count2,msg[0].length>0 ? msg[0][0].m:msg[1][0].m); }else{ var re1 = fullM(months1,count1); var re2 = fullM(months2,count2); } }
为了考虑安全时间,所以客户端JS根据后台传过来的当前时间做: function fullM(months,arr2,date){ var re1 = [],re2=[]; if(arguments.length == 3){ var day = date; }else{ var d = new Date(),day = d.getMonth()+1; }
for(var i=0;i<months.length;i++){ if(i==0){ for(var j = 1;j<=parseInt(months[i]);j++){ re1.push(rN(j)); if(j==months[i]){ re2.push(parseInt(arr2[i])); }else{ re2.push(0); }
} }else{
if(re1.length < months[i]){ for(var j = re1.length;j<=months[i];j++){ if(j != re1.length){ re1.push(rN(j)); if(j==months[i]){ re2.push(parseInt(arr2[i])); }else{ re2.push(0); } } } }else{ re1[months[i]-1] = rN(months[i]); re2[months[i]-1] = parseInt(arr2[i]); } } }
for(var i = re1.length;i<=day;i++){ if(i != re1.length){ re1.push(rN(i)); re2.push(0); }
}
return [re1,re2]; }
function arrmax(arr){ var j = arr[0]; for(var i=0;i<arr.length;i++){ if(j <= arr[i]){ j = arr[i]; } } return j; }
以上代码逻辑是按照:获取到的date数组日期循环->距离当前时间差->返回二维数组[时间数组,数量数组]。 但是,此逻辑写起来实在太混乱,自己被逻辑搞乱了,绕了N个大弯。 今天终于绕回来了,逻辑就一个主线:如果date单位为月(时),那么从1(0)开始循环加到当前年月,在此途中添加对应数量cout function fullM(arr1,arr2,date){ var re1 = [],re2=[]; if(arguments.length == 3){
var day = date; }else{ var d = new Date(),day = d.getMonth()+1; } for(var i=1;i<=day;i++){ re1.push(i); var j = retM(i,arr1); if(j>=0){ re2.push(arr2[j]); }else{ re2.push(0); } } return [re1,re2]; } function retM(i,arr){ for(var j=0;j<arr.length;j++){ if(i==arr[j]){ return j; } } return -1; } 做事情,最容易犯的小错误就是 把简单的东西复杂化…