Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript移除对象中不必要的属性

JavaScript移除对象中不必要的属性

作者头像
奋飛
发布于 2021-12-30 13:07:01
发布于 2021-12-30 13:07:01
1.9K00
代码可运行
举报
文章被收录于专栏:Super 前端Super 前端
运行总次数:0
代码可运行

Thinking系列,旨在利用10分钟的时间传达一种可落地的编程思想。

业务开发中,我们经常会遇到:基于后端返回接口数据,前端保存到对象 Object 中,前端开发过程中为了一些场景的便利性,需要在该对象中增加相应的属性,但这些属性对于后端没有意义,保存提交时希望删除掉。

真实业务代码:保存前需要删除对应的 *Value 字段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async saveData (type, data) {
  // 提交时删除多余字段
  delete data.isCommonValue
  delete data.isRemoteValue
  await this.$request({
    ...API.EDIT_SERVICE,
    method: type === 'add' ? 'post' : 'put',
    data
  })
}

上述是大家普遍的写法,但部分场景下上述写法并不是最优写法,且可能会带来一些副作用。下面通过 示例 的方式阐述一下:

示例

为了更好的展示上述情况,我们重新编写示例(仅为说明实现)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let person = {
  id: '001',
  name: 'ligang', 
  email: 'xxx@x.com'
}

诉求:在提交给后端时,需要删除 email 字段。

方式一:delete 删除

同上述给到的业务代码处理方式一样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete person.email
console.log(person)	// {id: '001', name: 'ligang'}

原数据中的相关属性也会删除掉。

Reflect.deleteProperty() 允许用于删除属性,同上述 delete 行为一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Reflect.deleteProperty(person, 'email')
方式二:解构

形成新的对象,避免在引用原始对象的地方产生副作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let {id, name} = person
let newPerson = {id, name}
console.log(newPerson) // {id: '001', name: 'ligang'}

会和原数据切断引用。对于保留属性个数少,该方式处理简单且易懂;保留属性过多的场景会比较复杂。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let {email, ...newPerson} = person
console.log(newPerson) // {id: '001', name: 'ligang'}

会和原数据切断引用。对于保留属性个数多,该方式处理简单且易懂;保留属性过少的场景会比较复杂。

总结

实际使用中,强烈建议方式二来操作,不要影响原数据。特别是在mvvm框架中,原数据往往是响应式的,delete/deleteProperty 意味着切断“响应关系”,delete 操作之后的数据响应就会有问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data () {
  return {
    person: {
      name: 'ligang',
      email: 'x@x.com'
    }
  }
},
methods: {
	deleteProp () {
  	delete this.person.email
    // this.$delete(this.person, 'email')
	},
  addProp () {
  	this.person.email = 'xxx'
    this.$set(this.person, 'address', 'xxx')
  }
}
  1. 执行 delete 操作,js 对象属性剔除掉了,但页面没有及时响应,可以使用 vue 中的 this.$delete() 确保删除能触发更新视图
  2. 执行 add 操作,重新添加 email 及 address 属性
    • this.person.email = 'xxx' 并不具备响应式
    • this.$set(this.person, 'address', 'xxx') 具备响应式

补充

对于已经创建的实例,Vue 不允许动态添加根级别的响应式 property。下述方式都无效!-- vue reactivity object

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.$set(this, 'email', '')
this.$set(this.$data, 'email', '')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/10/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue2 vs vue3 响应式实现原理
响应式实现原理vue2 vs vue3 // vue2 let p = {} // 捕获对象某个属性的读写操作 Object.defineProperty(p, 'name', { configurable: true, get(){ // 捕获读取属性 }, set(value){ // 捕获修改属性 } }) // vue3 let person = { name: 'psr' } // 捕获了对象person所有属性的所有操作,并通过Reflect操作被代理源对象属性进行操作 const p
路过君
2022/04/13
2090
理清vue2,vue3响应式原理
对新对象p进行数据劫持,当访问到name属性时,会执行get()方法,从而返回源对象person的name属性。当修改p的name属性时,会执行set()方法,此时源对象的person中name属性就会同步更改
qiangzai
2022/09/21
5050
理清vue2,vue3响应式原理
重学ES6之代理Proxy和反射Reflect
Proxy代理,Reflect反射。 调用new Proxy()可以创建代替其他目标(target)对象的代理,它虚拟化了目标,所以两者看起来功能一致。 代理可以拦截JavaScript引擎内部目标的底层对象操作,这些底层操作被拦截后会触发相应特定操作的陷阱函数。(钩子函数Hook) 反射API以Refelect对象的形式出现,对象中方法的默认特性与相同的底层操作一致,而代理可以覆写这些操作,每个代理陷阱对应一个命名和参数都相同的Refelect方法。 Tips 无论是Object.definP
19组清风
2021/11/15
5250
vue 3.0 pre-alpha
一个月前尤大大公布了 vue 3.0 的源码,目前还是 pre-alpha 状态,预计年后会发布正式版本。听到这个消息的第一反应是学习好累呀,在知乎上瞄了一眼尤大大对功能简单的介绍,感觉难,直接放弃了学习。 冷静了一段时间之后,认真的看了看,好像也不是很难。慢慢学,慢慢看,不着急。慢一点或许到达的更好一点
sunseekers
2019/11/13
8390
实现一个简化版的Vue3数据侦测
距离国庆假期尤大发布vue3前瞻版本发布已经有一个月的时间,大家都知道在vue2x版本中的响应式数据更新是用的defineProperty这个API。
w候人兮猗
2020/07/01
5800
vue3知识点:Vue3.0中的响应式原理和 vue2.x的响应式
答案:请看官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html
刘大猫
2024/10/31
1210
vue3 day02
reactive 作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数) 语法: const 代理对象 = reactive(源对象) 接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象) reactive定义的响应式数据是深层次的 内部基于es6的proxy实现的,通过代理对象操作源对象内部数据进行操作 如果使用reactive来定义基本类型,会有如下报错 let number = reactive(666) 使用reactive代理ref 避免.v
花花522
2023/03/07
2560
vue3 day02
vue3与vue2的区别之数据响应
️这里一定要明确一个概念,数据响应式和视图更新是没有关系的!数据响应式是一种机制,一种数据变化的侦测机制。而实现数据响应式这种机制的方法不唯一。 那么,在vue是如何实现数据响应式的?vue2和vue3的数据响应式有什么区别?
conanma
2021/11/03
5720
Vue3 的响应式和以前有什么区别,Proxy 无敌?(面试热门,源码级详解)
大家都知道,Vue2 里的响应式其实有点像是一个半完全体,对于对象上新增的属性无能为力,对于数组则需要拦截它的原型方法来实现响应式。
ssh_晨曦时梦见兮
2020/04/14
7920
2021年,让我们手写一个mini版本的vue2.x和vue3.x框架
首先,不管三七二十一,既然是实例化一个mini-vue,那么我们先定义一个类,并且它的参数一定是一个属性配置对象。如下:
陈大鱼头
2021/08/20
6550
自己实现一个VUE响应式--VUE响应式原理
这里的响应式(Reactive)不同于CSS布局的响应式(Responsive), 这里的响应式是指数据和视图的绑定,数据一旦更新,视图会自动更新。下面让我们来看看Vue是怎么实现响应式的,Vue 2.0和Vue 3.0的实现原理还不一样,我们来分开讲。
蒋鹏飞
2020/10/15
6650
自己实现一个VUE响应式--VUE响应式原理
Vue3 的响应式和以前有什么区别,Proxy 无敌?
大家都知道,Vue2 里的响应式其实有点像是一个半完全体,对于对象上新增的属性无能为力,对于数组则需要拦截它的原型方法来实现响应式。
ssh_晨曦时梦见兮
2020/10/15
1.3K0
vue组件对象字面量传值的注意啦!
前面汇总过 「vue组件引用传值的最佳实践」,对于 vue2 版本存在一个严重的性能问题,需要格外注意:对象字面量的传递
奋飛
2020/05/28
2.3K0
从 Proxy 到 Vue3 响应式
最近想再回顾下 Proxy 这一部分的内容, 顺便也看看他的应用场景, 刚好在 Vue3 的响应式 API 中有使用, 所以就结合着一起复习下, 顺便总结记录一番. 如果只对 Vue3 的响应式感兴趣的, 可以直接跳到文章的第二部分.
BLUSE
2022/12/02
1.3K1
面试官:Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?
定义:Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
@超人
2021/02/26
6560
面试官:Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?
第十六章 vue数据监测原理
概念: **​​Object.defineProperty()​​ **方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
张哥编程
2024/12/13
970
vue2和vue3响应式实现区别
对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。
Eternity
2022/10/31
5540
Vue3响应式原理
Proxy可以在目标对象上加一层拦截/代理,外界对目标对象的操作,都会经过这层拦截
scarsu
2020/10/22
8020
Vue3响应式原理
Vue3学习笔记(二)——组合式API(Composition API)
官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html
张果
2022/10/31
4.5K0
Vue3学习笔记(二)——组合式API(Composition API)
Vue3基础
官方文档:https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create
六个周
2022/10/28
1K0
Vue3基础
相关推荐
vue2 vs vue3 响应式实现原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验