添加动态属性
给对象添加属性,名称动态变化怎么办?
let obj = {};let index = 1;let key = `topic${index}`;obj[key] = 'topic';
ES6 中的对象属性名可以使用表达式,不用创建一个额外的变量
let obj = {};let index = 1;obj[`topic${index}`] = 'topic';
Object对象转化为表单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))
表单FormData对象转化为Object对象
const formToObject = form =>Array.from(new FormData(form)).reduce((acc, [key, value]) => ({...acc,[key]: value}),{});formToObject(document.querySelector('#form'));// { email: 'test@email.com', name: 'Test Name' }
深拷贝
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);
// from https://www.30secondsofcode.org/js/s/deep-clone/const deepClone = obj => {if (obj === null) return null;let clone = Object.assign({}, obj);Object.keys(clone).forEach(key =>(clone[key] =typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]));if (Array.isArray(obj)) {clone.length = obj.length;return Array.from(clone);}return clone;};const a = { foo: 'bar', obj: { a: 1, b: 2 } };const b = deepClone(a); // a !== b, a.obj !== b.obj
deepMerge
https://github.com/vuejs/create-vue/blob/main/utils/deepMerge.ts
const isObject = (val) => val && typeof val === 'object'const mergeArrayWithDedupe = (a, b) => Array.from(new Set([...a, ...b]))/*** Recursively merge the content of the new object to the existing one* @param {Object} target the existing object* @param {Object} obj the new object*/function deepMerge(target, obj) {for (const key of Object.keys(obj)) {const oldVal = target[key]const newVal = obj[key]if (Array.isArray(oldVal) && Array.isArray(newVal)) {target[key] = mergeArrayWithDedupe(oldVal, newVal)} else if (isObject(oldVal) && isObject(newVal)) {target[key] = deepMerge(oldVal, newVal)} else {target[key] = newVal}}return target}export default deepMerge
