前端如何处理后端传入的复杂数据格式

news2025/1/8 19:45:28

在前后端联调过程中不难发现,有时候从后端获取到的数据格式并不是我们所想要的格式,这时候就需要我们自己动手去处理了。最近在开发项目过程中也是遇到了很多传入的数据格式和自己所想要展示的有所区别,这里就先记录一下吧,总结总结,以防后续开发过程中再需要。(后续遇到其他也会持续进行更新)

目录

1.对象转数组

2.两个数组整合为一个数组

3.base64数据转为文件

4.时间处理方式


1.对象转数组

需要的格式是数组,类似于以下

const pieData = ref([
  { value: 40, name: '提出申请' },
  { value: 38, name: '自动化汇总' },
  { value: 32, name: '上报省调' },
  { value: 30, name: '自动化审核' },
  { value: 28, name: '现场人员许可' },
  { value: 28, name: '现场竣工申请' }
])

对方传来的是对象中单个放了每个字符串

statusCount: {
  "reported": 0,
  "appli": 0,
  "confirm": 0,
  "automation": 0,
  "automationSummary": 0,
  "operationStaffTermination": 0,
  "operationStaffPermission": 0
}

转化方式:首先先做个映像,用于将所传的字段转为自己所需要的文字,然后使用Object.keys遍历。Object.keys()‌是一个JavaScript内置函数,用于返回一个给定对象的所有可枚举属性的名称组成的数组

//做映射
const mapping = ref({
  reportedToProvincialDispatch: '上报省调',
  applicationSubmitted: '提出申请',
  confirmedCompletionArchived: '现场竣工申请',
  automationReview: '自动化审核',
  automationSummary: '自动化汇总',
  operationStaffTermination: '现场人员终止',
  operationStaffPermission: '现场人员许可'
})
Object.keys(statusCount).forEach(key => {
  pieData.value.push({
    value: statusCount[key], // 使用后端数据的值
    name: mapping.value[key] // 使用映射对象中的名称
  })
})

2.两个数组整合为一个数组

这里是做表格,需要的数据格式为数组中包含每个对象,其中这个数组中的fileName只区分今日和昨日,再没其他的数据。

const tableList = ref([
  {
    fileName:'今日',
    stationName:'北京站',
    workContent:'工作内容1'
  },
  {
    fileName:'昨日',
    stationName:'上海站',
    workContent:'工作内容2'
  },
  {
    fileName:'今日',
    stationName:'广州站',
    workContent:'工作内容3'
  },
  {
    fileName:'今日',
    stationName:'深圳站',
    workContent:'工作内容4'
  }
])

传来的格式为,并且里面不包含fileName这个字段

workingOrders: {
  "yesterdayCompleted": [
    {
      "stationName": "string",
      "workContent": "string"
    }
  ],
  "todayStarted": [
    {
      "stationName": "string",
      "workContent": "string"
    }
  ]
}

具体转化方法,首先一个数组一个数组遍历,并把遍历后的值push到所需的数组中

//遍历昨日完工单
workingOrders.yesterdayCompleted.forEach(item => {
  tableList.value.push({
    fileName: '昨日',
    stationName: item.stationName,
    workContent: item.workContent
  })
})
//遍历今日完工单
workingOrders.todayStarted.forEach(item => {
  tableList.value.push({
    fileName: '今日',
    stationName: item.stationName,
    workContent: item.workContent
  })
})

3.base64数据转为文件

在做获取录音文件的内容时,对方给的数据中文件数据为base64类型,但是前端这边其实这种是无法进行获取并播放的,还需要转为成可播放的文件才可,以下是想要得到的格式类型

const recordingList=ref([
  {
    id:1,
    name:'录音1',
    url:'http://localhost:3000/static/audio/1.mp3',
    duration:'00:01:00',
    file:File
  },
  {
    id:2,
    name:'录音2',
    url:'http://localhost:3000/static/audio/2.mp3',
    duration:'00:02:00',
    file:File
  }
])

对方传来的数据样式

data: [
  {
    "id": "文件ID",
    "mp3FileData": "base64编码的音频文件数据",
    "fileName": "文件名",
    "createTime": "文件创建时间",
    "duration": "录音时长"
  }
]

转化方式

const list = data.map(item => {
  //处理录音文件
  const base64Data = item.mp3FileData // 去掉前缀
  const binaryString = atob(base64Data) // 解码 Base64
  const byteArray = new Uint8Array(binaryString.length) // 创建一个新的 Uint8Array 对象
  // 将 base64 解码为 Uint8Array
  for (let i = 0; i < binaryString.length; i++) {
    byteArray[i] = binaryString.charCodeAt(i)
  }
  // 将 Uint8Array 转换为 Blob
  const blob = new Blob([byteArray], { type: 'audio/ogg; codecs=opus' })
  // 将 Blob 转换为 File-->可以直接上传到服务器
  const file = new File([blob], 'audio.ogg', { type: blob.type })
  // 将 Blob 转换为 URL-->可以直接播放
  const url = URL.createObjectURL(blob)
  return {
    id: item.id,
    name: item.fileName,
    url: url,
    time: item.duration,
    file: file
  }
})
// 将处理后的列表数据绑定到定义数组上
recordingList.value = list

4.时间处理方式

有时候可能后端传给我们的时间格式并不是我们想要的,所以在前端这里还需要做个中间处理,例如传给我的时间数据为99秒,亦或者是01:30这种,而我们想要的格式是多少小时多少分或者多少秒,首先对于第一种数据进行处理方式如下:

// 将秒转换为小时、分钟和秒的字符串
const formatTime = seconds => {
  // 秒数转化为小时、分钟、秒
  const hours = Math.floor(seconds / 3600)
  // 计算分钟和秒
  const minutes = Math.floor((seconds % 3600) / 60)
  // 计算秒
  const secs = (seconds % 3600) % 60
  // 格式化字符串
  let timeString = ''
  // 补零
  if (hours > 0) {
    timeString += `${hours}小时`
  }
  if (minutes > 0 || hours > 0) {
    timeString += `${minutes}分`
  }
  // 秒数不足两位时,补零
  timeString += `${secs}秒`
  return timeString
}
// 示例
const time='80'
const timeStr = formatTime(time)
console.log(timeStr,'输出为1分20秒')

第二种:传的数据为01:30这种,具体处理方式

//第二种方式:01:30 -> 1分30秒
const formatTimeToClock = timeStr => {
  // 转换时间字符串为分钟和秒数
  const [hours, minutes] = timeStr.split(':').map(Number)
  // 计算总分钟数
  const totalMinutes = hours * 60 + minutes
  // 获取分钟和秒数部分
  const minutesPart = Math.floor(totalMinutes / 60)
  // 计算秒数
  const secondsPart = totalMinutes % 60
  // 格式化结果字符串
  return `${minutesPart}分${secondsPart}秒`
}
const timeStr = '01:30'
const clockStr = formatTimeToClock(timeStr)
console.log(clockStr) // 输出 1分30秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【竞技宝】CS2:HLTV2024职业选手排名TOP8-broky

北京时间2025年1月7日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP8为FAZE战队的broky。 选手简介 broky是一位来自拉脱维亚的职业CS选手,现年23岁。2018年7月,broky获得了FPL资格,连续几季在榜上前5。他的首次赛场留名是跟随拉脱维亚本土战队Wolsung出征BES…

Java到底是值传递还是引用传递????

在搞懂这个问题之前, 我们要首先了解什么是值传递, 什么是引用传递? 值传递: 传递的是数据的副本&#xff0c;修改副本不会影响原始数据。引用传递: 传递的是数据的引用&#xff08;地址&#xff09;&#xff0c;修改引用会直接影响原始数据. 也就是说&#xff0c;值传递和引…

Vue3国际化多语言的切换

参考链接: link Vue3国际化多语言的切换 一、安装 vue-i18n 和 element-plus vue-i18n 是一个国际化插件&#xff0c;专为 Vue.js 应用程序设计&#xff0c;用于实现多语言支持。它允许你将应用程序的文本、格式和消息转换为用户的首选语言&#xff0c;从而提供本地化体验。…

2024AAAI SCTNet论文阅读笔记

文章目录 SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation摘要背景创新点方法Conv-Former Block卷积注意力机制前馈网络FFN 语义信息对齐模块主干特征对齐共享解码头对齐 总体架构backbone解码器头 对齐损失 实验SOTA效果对比Cit…

xss-labs关卡记录15-20关

十五关 随便传一个参数&#xff0c;然后右击查看源码发现&#xff0c;这里有一个陌生的东西&#xff0c;就是ng-include。这里就是&#xff1a; ng-include指令就是文件包涵的意思&#xff0c;用来包涵外部的html文件&#xff0c;如果包涵的内容是地址&#xff0c;需要加引号。…

计算机网络 (30)多协议标签交换MPLS

前言 多协议标签交换&#xff08;Multi-Protocol Label Switching&#xff0c;MPLS&#xff09;是一种在开放的通信网上利用标签引导数据高速、高效传输的新技术。 一、基本概念 MPLS是一种第三代网络架构技术&#xff0c;旨在提供高速、可靠的IP骨干网络交换。它通过将IP地址映…

打造三甲医院人工智能矩阵新引擎(四):医疗趋势预测大模型篇 EpiForecast与DeepHealthNet合成应用

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗领域积累了海量的数据,涵盖电子病历、医学影像、基因序列、临床检验结果等多源异构信息。这些数据蕴含着疾病发生发展、治疗反应、疫情传播等规律,为医疗趋势预测提供了数据基础。准确的医疗趋势预测能辅助医疗机构提前…

小白学Pytorch

小白学Pytorch 发现一个比较好的教程&#xff0c;对于自己来说比较合适&#xff0c;适合从零开始的教程。 1、搭建一个简单的网络 https://www.cnblogs.com/PythonLearner/p/13587092.html 搭建网络这步说的比较清楚&#xff1a; 我们使用nn包中的Sequential搭建网络&#…

基于RedHat9部署WordPress+WooCommerce架设购物网站

系统版本信息&#xff1a;Red Hat Enterprise Linux release 9.2 (Plow) WordPress版本信息&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本信息&#xff1a;woocommerce.9.5.1 环境架构&#xff1a;LNMP&#xff08;RedHat9nginx1.20.1PHP 8.0.27MySQL8.0.30&#xff09; …

Spring源码分析之事件机制——观察者模式(一)

目录 事件基类定义 事件监听器接口 事件发布者接口及实现 事件广播器实现 小小总结 Spring源码分析之事件机制——观察者模式&#xff08;一&#xff09;-CSDN博客 Spring源码分析之事件机制——观察者模式&#xff08;二&#xff09;-CSDN博客 Spring源码分析之事件机制…

JDK、JRE、JVM三者的关系、JDK8的新特性、JVM内存结构,堆栈的区别

1&#xff0e;JDK、JRE、JVM三者的关系 JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual Machine)----Java虚拟…

【Linux】文件的压缩与解压

目录 gzip和 gunzip bzip2 和 bunzip2(特点和gzip相似) xz和unxz(特点和gzip相似) zip 和 unzip tar gzip和 gunzip 特点&#xff1a;只能对单个的普通文件进行压缩 不能进行归档&#xff0c;压缩或解压后的源文件都不存在 压缩后所生成的压缩格式是.gz格式 压缩&…

LInux单机安装Redis

1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…

VSCode 使用鼠标滚轮控制字体

一、 文件 | 首选项 | 设置 二、单击在 settings.json中编辑 "editor.mouseWheelZoom": true 注注注意&#xff1a;保存哦&#xff01;ctrlS 三、测试 按住ctrl鼠标滚轮&#xff0c;控制字体大小

enzymejest TDD与BDD开发实战

一、前端自动化测试需要测什么 1. 函数的执行逻辑&#xff0c;对于给定的输入&#xff0c;输出是否符合预期。 2. 用户行为的响应逻辑。 - 对于单元测试而言&#xff0c;测试粒度较细&#xff0c;需要测试内部状态的变更与相应函数是否成功被调用。 - 对于集成测试而言&a…

TCP通信原理学习

TCP三次握手和四次挥手以及为什么_哔哩哔哩_bilibili

空间不足导致Oracle集群内存使用率暴增

一、现象 操作系统内存使用率告警&#xff0c;已达到98%,&#xff0c;告警内容如下&#xff1a; 【全景监控&#xff1a;Oracle主机内存使用监控】 【主机名】&#xff1a;XXXXX11 【主机IP】主机IP&#xff1a;*.126.15 【告警内容】当前内存使用率为98.9%&#xff0c;超警…

嵌入式入门Day38

C Day1 第一个C程序C中的输入输出输出操作coutcin练习 命名空间使用方法自定义命名空间冲突问题 C对字符串的扩充C风格字符串的使用定义以及初始化C风格字符串与C风格字符串的转换C风格的字符串的关系运算常用的成员变量输入方法 布尔类型C对堆区空间使用的扩充作业 第一个C程序…

【JMM】Java 内存模型

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 前言2. JMM 内存模型内容3. JMM 内存模型简单执行示意图 ⚠️ 不要与 JVM 内存分布混为一谈论&#xff0c…

SEO新革命:如何通过Search Everywhere优化全面打破搜索壁垒

谷歌不再总是人们寻求答案的首选之地。他们越来越多地转向社交媒体、YouTube、亚马逊和 ChatGPT。这些平台本身已经成为搜索引擎。 因此&#xff0c;SEO 需要发展。仅靠搜索 “引擎” 优化已经不够了。品牌需要优化其在每个平台上的自然存在。 您需要一种新型的 SEO&#xff…