JavaScript 如何实现:对象condition为checked时将a、b属性移入items数组
问题原因定位
你之前尝试的两种方法没法生效,本质是方法和场景不匹配:
splice是数组专属的原型方法,设计出来就是用来操作数组元素的增删改,完全不支持操作普通对象的属性,从适用范围上就走错了方向- 普通JavaScript对象默认是不可迭代的,直接用
for...of遍历对象会直接抛出object is not iterable的运行时报错,自然没法正常完成属性读取、移除的操作
顺便提个小细节:你贴的示例对象里,
condition属性行末尾漏写了逗号,实际运行的时候会触发语法错误,记得补上。
具体实现方案
要达成目标效果,不需要写复杂的遍历逻辑,顺着下面3步操作就能完成:
- 先做条件判断,只有当
obj.condition === 'checked'时才执行后续的属性移动逻辑 - 把对象上的
a、b两个属性的值提取出来,组装成一个单独的子对象 - 从原对象上删掉
a、b这两个顶层属性,把组装好的子对象塞进items数组就完成了
兼容性最好的基础写法
这种写法逻辑直白,没有特殊语法,所有JS运行环境都能正常工作:
if (obj.condition === 'checked') { // 提取需要移动的属性生成子对象 const movedItem = { a: obj.a, b: obj.b } // 从原对象删除a、b顶层属性 delete obj.a delete obj.b // 子对象推入items数组 obj.items.push(movedItem) }
简洁度更高的ES6+写法
如果项目支持ES6及以上语法,可以用解构赋值减少冗余的属性访问代码:
if (obj.condition === 'checked') { // 解构取出a、b的值,其余属性自动归入restProps变量 const { a, b, ...restProps } = obj // 把原对象更新为移除a、b后的内容 Object.assign(obj, restProps) // 清除原对象上残留的a、b属性 delete obj.a delete obj.b // 推入组装好的子项 obj.items.push({ a, b }) }
边界兼容处理
如果不能保证原对象一定存在a、b属性,可以在提取时做过滤,避免生成带undefined值的无效子对象:
if (obj.condition === 'checked') { const movedItem = {} // 只把真实存在的属性收集到子对象里 if ('a' in obj) movedItem.a = obj.a if ('b' in obj) movedItem.b = obj.b // 只有收集到了有效属性才执行删除和push操作 if (Object.keys(movedItem).length) { delete obj.a delete obj.b obj.items.push(movedItem) } }
内容的提问来源于stack exchange,提问作者Errand
相关产品推荐
相关产品推荐

