js 数据填充 排序

181 阅读1分钟

问题描述:

后台返回给前端的时间(ywDate)是无序的,有的营销部门周 可能是断断断续续的

需求:

1.本部门没有的日期(ywDate) 但在其他部门有, 就需要把其他部门的时间日期(ywDate) 填充到这个部门 并设置(sale)为 0

2.在部门里面 按照时间 从小到大的顺序排序

image.png

image.png


var obj = {
    营销一部: [{
            ywDate: '2020年 第1周',
            sale: 50
        },
        {
            ywDate: '2021年 第14周',
            sale: 61
        },
        {
            ywDate: '2020年 第20周',
            sale: 47
        },
        {
            ywDate: '2020年 第10周',
            sale: 27
        },
    ],
    营销五部: [{
            ywDate: '2021年 第7周',
            sale: 80
        },
        {
            ywDate: '2020年 第20周',
            sale: 20
        },
        {
            ywDate: '2020年 第4周',
            sale: 90
        },
        {
            ywDate: '2021年 第15周',
            sale: 80
        },
    ],
    营销四部: [{
            ywDate: '2020年 第2周',
            sale: 20
        },
        {
            ywDate: '2021年 第14周',
            sale: 30
        },
        {
            ywDate: '2021年 第8周',
            sale: 80
        },
        {
            ywDate: '2020年 第3周',
            sale: 10
        },
    ]
}

function format(obj) {
    let snDateList = []; // 处理后的周

    // 获取 年周的所有数组
    for (let key in obj) {
        let list = obj[key]
        for (let i = 0; i < list.length; i++) {
            snDateList.push(list[i].ywDate)
        }
    }

    // 获把 年周的所有数组 去重
    snDateList = Array.from(new Set(snDateList));
    let isCharList = [];

    // 填充数组
    for (let key in obj) {
        let list = obj[key]
        let arr = []; // 获取每个部门的 年周
        let snDateListCopy = [...snDateList]
        for (let i = 0; i < list.length; i++) {
            let item = list[i];
            arr.push(item.ywDate)
        }
        // 在单个部门的年周里遍历,这个部门的年周是否包含在所有部门的年周里,有就在所有部门里删除这个年周
        for (let i = 0; i < arr.length; i++) {
            let index = snDateListCopy.indexOf(arr[i])
            if (index > -1) {
                // 在所有数组里 找该部门的年周,找到了 就删除掉,得到的是该部门没有的组
                snDateListCopy.splice(index, 1)
            } else {
                // 在所有数组里 找该部门的年周,没找到了,得到是该部门的数组
            }
        }
        // snDateListCopy 处理后 得到是 除了该部门之外的年周 需要统一把sales设置为0
        for (let i = 0; i < snDateListCopy.length; i++) {
            list.push({
                ywDate: snDateListCopy[i],
                sale: 0,
            })
        }
        // list 除了该部门之外的年周(设置为0) + 本部门的年周(有值)  = 该部门填充后的数据(还未排序)
        obj[key] = list;
    }

    // 填充了数据后,需要按照时间排序数组
    for (let key in obj) {
        let list = obj[key];
        for (let i = 0; i < list.length; i++) {
            let item = list[i];
            item.weekSort = item.ywDate.replace(/[^0-9]/gi, "");
            let year = item.ywDate.match(/(\S*)年/)[1] * 1;
            let weeks = item.ywDate.match(/第(\S*)周/)[1] * 1;
            weeks = weeks > 9 ? weeks : ('0' + weeks);;
            item.weekSort = year + "" + weeks; // 周是个位,没有0加上0
            // item.weekSort = item.weekSort.length == 6 ? item.weekSort : item.weekSort.replace(/(.{4})(.{1})/, "$10$2");
        }
        list.sort((a, b) => {
            return a.weekSort - b.weekSort; // 从小到大排序
        });
    };
    return obj
}

let objs = format(obj)
console.log(objs)