最近工作当中绕了N圈的功能函数(Nodejs相关)
最近工作当中绕了N圈的功能函数(Nodejs相关)
功能需求:展示产品的点击量和曝光量,然后用列表和图形展示。 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; } 做事情,最容易犯的小错误就是 把简单的东西复杂化…
最近工作当中绕了N圈的功能函数(Nodejs相关)
功能需求:
展示产品的点击量和曝光量,并通过列表和图形进行展示。
数据格式:
后台 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
单位可以是小时、某月中的某一日、某年中的某一月。count
单位是数量。m
是数据库当前日期。
问题描述:
在使用 AJAX 获取数据后,需要对数据进行处理,使其满足以下条件:
- 数据按日期顺序排列。
- 补充缺失的日期,缺失的日期对应的
count
值设为0
。
解决方案:
首先,我们定义一个函数来处理数据。这个函数将负责对数据进行排序并补充缺失的日期。
function processClickData(data) {
// 分离数据
let clicks = data[0];
let impressions = data[1];
// 对数据进行排序
clicks.sort((a, b) => a.date - b.date);
impressions.sort((a, b) => a.date - b.date);
// 获取最大日期
const maxDate = Math.max(clicks[clicks.length - 1].date, impressions[impressions.length - 1].date);
// 创建完整的日期数组
const completeDates = Array.from({ length: maxDate }, (_, index) => index + 1);
// 处理点击数据
const clickData = completeDates.map(date => {
const click = clicks.find(c => c.date === date);
return click ? parseInt(click.count) : 0;
});
// 处理曝光数据
const impressionData = completeDates.map(date => {
const impression = impressions.find(i => i.date === date);
return impression ? parseInt(impression.count) : 0;
});
return [completeDates, clickData, impressionData];
}
// 示例数据
const data = [
[{"date":"9","count":"1","m":"27"},{"date":"15","count":"11","m":"27"}],
[{"date":"9","count":"101","m":"27"},{"date":"15","count":"201","m":"27"}]
];
// 调用函数
const [dates, clicks, impressions] = processClickData(data);
console.log(dates); // 输出完整的日期数组
console.log(clicks); // 输出点击量数组
console.log(impressions); // 输出曝光量数组
解释:
- 数据分离: 首先我们将点击量和曝光量的数据分开处理。
- 数据排序: 使用
Array.prototype.sort()
方法对数据按日期进行排序。 - 创建完整日期数组: 使用
Array.from()
方法生成一个从 1 到最大日期的数组。 - 填充缺失数据: 使用
Array.prototype.map()
方法遍历完整日期数组,查找对应日期的数据。如果没有找到,则填充0
。
通过这种方法,我们可以确保数据按日期顺序排列,并且所有日期都被包含,缺失的日期也被正确地补上了 0
。这样可以避免复杂的逻辑和绕圈子的情况,使得代码更加简洁易懂。
根据你的描述,你需要实现一个功能,即展示产品的点击量和曝光量,并且需要对这些数据进行排序和填充缺失的日期。下面是使用Node.js和JavaScript实现这一功能的一个简化版本。
目标
- 对日期进行排序
- 填充缺失的日期,并将对应的数值设为0
示例代码
function processData(data) {
// 将数据转换为易于操作的对象
const clicks = data[0].map(item => ({
date: parseInt(item.date),
count: parseInt(item.count)
}));
const views = data[1].map(item => ({
date: parseInt(item.date),
count: parseInt(item.count)
}));
// 获取所有日期的范围
const minDate = Math.min(...clicks.map(item => item.date), ...views.map(item => item.date));
const maxDate = Math.max(...clicks.map(item => item.date), ...views.map(item => item.date));
// 创建一个包含所有日期的对象
const fullDates = {};
for (let date = minDate; date <= maxDate; date++) {
fullDates[date] = { clicks: 0, views: 0 };
}
// 填充点击量
clicks.forEach(item => {
if (fullDates[item.date]) {
fullDates[item.date].clicks = item.count;
}
});
// 填充曝光量
views.forEach(item => {
if (fullDates[item.date]) {
fullDates[item.date].views = item.count;
}
});
// 提取日期和对应的点击量、曝光量
const dates = Object.keys(fullDates).map(date => parseInt(date));
const clicksArray = dates.map(date => fullDates[date].clicks);
const viewsArray = dates.map(date => fullDates[date].views);
return [dates, clicksArray, viewsArray];
}
// 示例调用
const data = [
[{"date":"9","count":"1","m":"27"},{"date":"15","count":"11","m":"27"}],
[{"date":"9","count":"101","m":"27"},{"date":"15","count":"201","m":"27"}]
];
const [dates, clicks, views] = processData(data);
console.log(dates, clicks, views);
解释
- 数据转换:首先将数据转换成易于处理的对象格式。
- 日期范围:确定所有日期的最小值和最大值,以便生成完整的日期范围。
- 填充数据:创建一个对象,其中每个键是日期,值是一个包含点击量和曝光量的对象。
- 提取结果:最后,提取完整的日期数组和对应的点击量、曝光量数组。
这种方法可以确保所有日期都被包含进来,即使某些日期没有数据也会被设置为0。这样可以避免因数据缺失而导致的排序和数据不一致问题。