最近工作当中绕了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; } 做事情,最容易犯的小错误就是 把简单的东西复杂化…


2 回复

最近工作当中绕了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 获取数据后,需要对数据进行处理,使其满足以下条件:

  1. 数据按日期顺序排列。
  2. 补充缺失的日期,缺失的日期对应的 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); // 输出曝光量数组

解释:

  1. 数据分离: 首先我们将点击量和曝光量的数据分开处理。
  2. 数据排序: 使用 Array.prototype.sort() 方法对数据按日期进行排序。
  3. 创建完整日期数组: 使用 Array.from() 方法生成一个从 1 到最大日期的数组。
  4. 填充缺失数据: 使用 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);

解释

  1. 数据转换:首先将数据转换成易于处理的对象格式。
  2. 日期范围:确定所有日期的最小值和最大值,以便生成完整的日期范围。
  3. 填充数据:创建一个对象,其中每个键是日期,值是一个包含点击量和曝光量的对象。
  4. 提取结果:最后,提取完整的日期数组和对应的点击量、曝光量数组。

这种方法可以确保所有日期都被包含进来,即使某些日期没有数据也会被设置为0。这样可以避免因数据缺失而导致的排序和数据不一致问题。

回到顶部