在工作中,总会遇到一些不如意的接口,返回一些不如意的数据结构。遇到负责任的后端,会说为了接口的复用性和可扩展性。嗯,可以理解。但遇到某些后端,会说接口就是这样的,你处理下不难吧。咳咳。。。
本期让我们来细数一些常见的数据结构处理。
场景一: 如下图,接口返回的对象数组需要进行排序,若只是按某个字段升序或降序排列,直接用sort方法就可以了。但是产品说,需求是按 pear->orange->apple->banana的顺序排序。。。
作为一个身经十战的前端,怎么就不能打出身经百战的气势呢?直接和产品说,放马过来吧。
深吸一口气,直接亮出代码:
console.log(res.data.data, '原始数据')
const originData = res.data.data
let orderArr = ['pear', 'orange', 'apple', 'banana']
let formatData = []
orderArr.forEach(fruit => {
originData.forEach(obj => {
if (fruit === obj.fruit) {
formatData.push(obj)
}
})
})
console.log(formatData, '排序后的数组')
除此之外,当需要从接口中过滤出部分数据时,也可以用该方法。比如,原始数据多加了两条数据,当结果仍然不变。正所谓:千磨万击还坚劲,任尔东西南北风。
场景二: 在echarts图表的数据展示中,经常会出现上月同期的环比数据展示,对应的数据是以数组的形式传入,其索引对应的日期必须保持一致,但接口只能返回全部数据。
由于本月天数与上月天数都是不等的,数据索引对应的顺序就被打乱了,就会出现两种情况:
- 本月天数比上月天数少。处理目标:过滤掉上月多余的数据。
| 本月 | 2月28日 | 3月1日 |
|---|---|---|
| 上月同期 | 1月28日 | 1月29日 |
- 本月天数比上月天数多。处理目标:将上月缺少的数据都以最后一天的数据补全(产品定的)。
| 本月 | 3月29日 | 3月30日 |
|---|---|---|
| 上月同期 | 3月1日 | 3月2日 |
对于日期的处理,会使用dayjs的库 dayjs.fenxianglu.cn/category/ge…(moment.js也可以)。
上代码:
const { lastMonth, currentMonth } = res.data.data
console.log(res.data.data, '原始数据')
// 获取上月同期月份数组
// dayjs可以作日期相减运算,若本月天数大于上月天数,多出的日期对应上月为上月最后一天的日期
let currentMonthArr = currentMonth.map(item => this.$dayjs(item.date).subtract(1, 'month').format('YYYY-MM-DD'))
let formatLastMonthData = []
currentMonthArr.forEach(currentM => {
lastMonth.forEach(lastM => {
if(lastM.date === currentM) {
formatLastMonthData.push(lastM)
}
})
})
console.log(currentMonth, '本月原始数组')
console.log(formatLastMonthData, '排序后的上月数组')
对应情况1:本月天数比上月天数少。处理目标:过滤掉上月多余的数据。
对应情况2:本月天数比上月天数多。处理目标:将上月缺少的数据都以最后一天的数据补全