对象转化为FormData对象
/*** 对象转化为formdata* @param {Object} object*/export function getFormData(object) {const formData = new FormData()Object.keys(object).forEach(key => {const value = object[key]if (Array.isArray(value)) {value.forEach((subValue, i) =>formData.append(key + `[${i}]`, subValue))} else {formData.append(key, object[key])}})return formData}
使用场景:上传文件时我们要新建一个FormData对象,然后有多少个参数就append多少次,使用该函数可以简化逻辑。使用:
let req={file:xxx,userId:1,phone:'15198763636',//...}fetch(getFormData(req))
深拷贝
// 深拷贝export function deepClone(target: any): any {// 定义一个变量let result: any// 如果当前需要深拷贝的是一个对象的话if (typeof target === 'object') {// 如果是一个数组的话if (Array.isArray(target)) {result = [] // 将result赋值为一个数组,并且执行遍历for (const i in target) {// 递归克隆数组中的每一项result.push(deepClone(target[i]))}// 判断如果当前的值是null的话;直接赋值为null} else if (target === null) {result = null// 判断如果当前的值是一个RegExp对象的话,直接赋值} else if (target.constructor === RegExp) {result = target} else {// 否则是普通对象,直接for in循环,递归赋值对象的所有值result = {}for (const i in target) {result[i] = deepClone(target[i])}}// 如果不是对象的话,就是基本数据类型,那么直接赋值} else {result = target}// 返回最终结果return result}
function deepClone(obj, hash = new WeakMap()) {if (obj === null) return obj;// 如果是null或者undefined我就不进行拷贝操作if (obj instanceof Date) return new Date(obj);if (obj instanceof RegExp) return new RegExp(obj);// 可能是对象或者普通的值 如果是函数的话是不需要深拷贝if (typeof obj !== "object") return obj;// 是对象的话就要进行深拷贝if (hash.get(obj)) return hash.get(obj);let cloneObj = new obj.constructor();// 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身hash.set(obj, cloneObj);for (let key in obj) {if (obj.hasOwnProperty(key)) {// 实现一个递归拷贝cloneObj[key] = deepClone(obj[key], hash);}}return cloneObj;}let obj = { name: 1, address: { x: 100 } };obj.o = obj; // 对象存在循环引用的情况let d = deepClone(obj);obj.address.x = 200;console.log(d);
