接口返回数据处理的两种常见场景

849 阅读2分钟

在工作中,总会遇到一些不如意的接口,返回一些不如意的数据结构。遇到负责任的后端,会说为了接口的复用性和可扩展性。嗯,可以理解。但遇到某些后端,会说接口就是这样的,你处理下不难吧。咳咳。。。

本期让我们来细数一些常见的数据结构处理。

场景一: 如下图,接口返回的对象数组需要进行排序,若只是按某个字段升序或降序排列,直接用sort方法就可以了。但是产品说,需求是按 pear->orange->apple->banana的顺序排序。。。

image.png

作为一个身经十战的前端,怎么就不能打出身经百战的气势呢?直接和产品说,放马过来吧。

深吸一口气,直接亮出代码:

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, '排序后的数组')

image.png

除此之外,当需要从接口中过滤出部分数据时,也可以用该方法。比如,原始数据多加了两条数据,当结果仍然不变。正所谓:千磨万击还坚劲,任尔东西南北风。

image.png

场景二: 在echarts图表的数据展示中,经常会出现上月同期的环比数据展示,对应的数据是以数组的形式传入,其索引对应的日期必须保持一致,但接口只能返回全部数据。

image.png

由于本月天数与上月天数都是不等的,数据索引对应的顺序就被打乱了,就会出现两种情况:

  1. 本月天数比上月天数少。处理目标:过滤掉上月多余的数据。
本月2月28日3月1日
上月同期1月28日1月29日
  1. 本月天数比上月天数多。处理目标:将上月缺少的数据都以最后一天的数据补全(产品定的)。
本月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:本月天数比上月天数少。处理目标:过滤掉上月多余的数据。

image.png

对应情况2:本月天数比上月天数多。处理目标:将上月缺少的数据都以最后一天的数据补全

image.png