JS 数据操作(对象、数组)
前言:这里主要是针对 数组、对象作为保存 数据的功能来说明。而不是 作为 面向对象的操作的对象。
在 接口联调中,经常会用到 数据拷贝、删除 属性 等功能。这里就做一个总结。
JS对象
- JS中Object的属性是有序的,只是不能完全保证顺序(遍历规则会根据 key 值类型的不同而不同):https://mp.weixin.qq.com/s/Pg4HWdReVetmiCWY7jDHsw
- Key 都为自然数:当前的 key 如果是自然数就按照自然数的大小进行升序排序。
- Key 都为 String:如果 key 是不为自然数的 String(Number 也会转为 String)处理,则按照加入的时间顺序进行排序(即,按 插入顺序排序)。
- Key 都为symbol:如果 Key 都为 Symbol,顺序和 String 一样,也是按照添加的顺序进行排序的。
- JS对象的 浅拷贝方法:
浅拷贝创建一个新的对象,只拷贝一层,即拷贝对象里第一层基本数据类型的值和引用类型的地址
- Object.assign()
- 展开运算符 Spread ...
- JS对象的 深拷贝方法:
深拷贝就是在堆内存中开辟一个新的空间存放新对象,拷贝原对象的所有属性,拷贝前后两个对象互不影响
- 递归实现
- JSON.parse(JSON.stringify(obj))
- lodash工具包(第三方工具)
JS 数组
- JS数组的 浅拷贝方法:
- 展开运算符 Spread ...
- Array.prototype.concat():concat 省略了参数,则 会返回调用此方法的现存数组的一个浅拷贝。
var arr_old = [1, 2, {name: 'Tom'}] var arr_new = arr_old.concat() // concat 省略了参数,则 会返回调用此方法的现存数组的一个浅拷贝。 console.log(arr_old === arr_new) // false console.log(arr_old[2]=== arr_new[2]) // true
- Array.prototype.slice():slice 省略了参数,则 会返回调用此方法的现存数组的一个浅拷贝。
let arr_old = [1, 2, {name: 'Tom'}] let arr_new = arr_old.slice() // slice 省略了参数,则 会返回调用此方法的现存数组的一个浅拷贝。 console.log(arr_old === arr_new) // false console.log(arr_old[2]=== arr_new[2]) // true
- JS数组的 深拷贝方法:
- 递归实现
- JSON.parse(JSON.stringify(obj))
- lodash工具包(第三方工具)
总结:对象、数组的浅拷贝的方法 差异比较大,因为他们的都是各种方法中的附带功能。
如果拷贝的数据只有一层,那 浅拷贝就是 深拷贝。所以处理表单数据,大部分只要使用浅拷贝就可以了。
删除对象属性(接口联调)
JS中表单提交,如果表单比较复杂时,往往会涉及 用户不同的选择,其它表单项 会显示/隐藏。
这种情况在提交表单时,肯定不能把隐藏的表单项的字段提交上去。所以需要删除对象的属性值。
删除JS对象属性的方法:https://blog.csdn.net/FantasyBreaker/article/details/125386520
1、将属性设置为 undefined 【个人推荐这种方式】
2、使用 delete 操作符
3、使用对象解构
4、使用Reflect
5、删除数组元素
- delete(不推荐,没有真正删除,只是改变了值)
delete arr[0];
- splice