请问js有可以删除对象里某个属性但不改变原对象的方法吗?

问题描述

案例: 有一个Form表单,数据是obj对象,当其里面属性a满足1的条件的时候, 需要删除该属性. 请问有什么办法不影响obj对象仍包含a属性吗.

let obj = {
  a: 1,
  b: 2,
  c: 3
}

obj.a == 1 && delete obj.a;

console.log(obj);

能否用解构等方法解决呢?


----- 第一次更新 -----
我解释一下这么做的原因.
因为我需要在state(react)保证这个字段的完整性.因为页面组件需要渲染它们的值.a=1的值后端不需要 我传的时候需要去掉 但是又不能直接该原对象. 直接解构属性又太多了~


----- 第二次更新 -----
解构有没有一种方法能够做到呢?之前想通过改变对象的做法来改变传值,风险太大. 现在想直接在传参的地方处理. 因为参数不固定,所以没法直接解构
❎:submit(Object.assign({},b,c);)

阅读 12.3k
10 个回答
let {a,...obj} = {a:1,b:2,c:3};
obj//{b: 2, c: 3}

let {a,...obj} = {a:1,b:2,c:3};
obj//{b: 2, c: 3}

let {a,...b} = obj;
if(a==1){
obj = b
}

obj.a == 1 && obj.a = undefined;

不太明白什么意思,要删除a属性又要包含a属性?

深拷贝一个新的对象,在新的对象上面做处理,这样就不会影响到原有对象,又保证传递到后台的数据是OK的

这问题有点不清不楚,什么是既删除又不改变。
问的是深度克隆吗,obj0克隆obj1,obj0删除属性,obj1不变。
还是设置对象的某个属性为不可枚举,数据存在,可被操作,但不会被遍历搜寻到。

深度克隆

// 使用例子
// var obj0 = { a:1, b:'2', c:[true,null,{cc:'cc'}], d:function(){ console.log("run") } }
// var newObj = objClone(obj0);
// console.log(newObj);


// initalObj为克隆的来源,
// finalObj为最终目标,
// attrs为obj的属性子集,
// filterFlag为true表示只克隆attrs中的属性,为false表示克隆除attrs中的属性
function objClone(initalObj, finalObj, attrs, filterFlag){
  var o = finalObj ? objClone(finalObj) : initalObj instanceof Array ? [] : {};
  if(initalObj && typeof initalObj == 'object' && initalObj.constructor !== Object) {
    o.__proto__ = initalObj.__proto__
  }
  for(var k in initalObj) {
    if(attrs && !!filterFlag == (attrs.indexOf(k) == -1)){
      continue;
    }
    o[k] = (initalObj[k] && typeof(initalObj[k]) === 'object') ? objClone(initalObj[k]) : initalObj[k];
  }
  return o;
}

1 . 维护一个数组或者对象来存储需要显示的内容

let obj = {
  a: 1,
  b: 2,
  c: 3
}

let arr = ['b','c']

2 .直接就给对象

let obj = {
  a: {value: 1,show:false},
  b: {value: 2,show:true},
  c: {value: 3,show:true}
}

偷懒方法JSON.stringify 然后JSON.parse 然后删除属性。。

JSON.parse(JSON.stringify({a:1,b:2,c:3}, ['a', 'b']))  // {a: 1, b: 2}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题