删除引用的JS对象中的属性

时间:2018-09-10 20:20:40

标签: javascript ecmascript-6 babel

假设我要删除JS对象中的属性

const source = {
  nestA: {
    nestB: {
      nestC: 'deleteMe'
    }
  }
}
const clone = {}
clone.nestA = {...source}.nestA
delete clone.nestA.nestB
console.log(source)

执行上述脚本
期望:source保持原样
实际:source将变成{}

但是,如果我只做delete clone.nestAsource将会保持原样

问题:delete clone.nestA.nestB如何影响source。但是delete clone.nestA不是吗?

2 个答案:

答案 0 :(得分:3)

  

.transition {transition: width .5s ease;} 如何影响delete clone.nestA.nestB,但source却没有?

delete clone.nestAsource是不同的对象。从clone属性和source.nestA属性都引用了第三个对象。 (另一个对象位于该对象的clone.nestA属性上。)

当删除nestB上的属性(如source属性时)只会影响source.nestA对象。

删除第三个对象的属性,例如sourcesource.nestA.nestB(同一对象的相同属性)时,只会影响第三个对象。只是clone.nestA.nestBsource现在都引用了缺少属性的对象。

答案 1 :(得分:1)

您可以使用对象的assign方法来创建深层副本,这样您的源就无法被触摸。

let deepCopy = Object.assign({},source);
// do anything with deepCopy.

更新- 它不会创建嵌套对象的深层副本。您可以使用以下方法为嵌套对象创建深层副本。

let deepCopy = JSON.parse(JSON.stringify(source));

function cloneObject(obj) {
var clone = {};
for(var i in obj) {
    if(obj[i] != null &&  typeof(obj[i])=="object")
        clone[i] = cloneObject(obj[i]);
    else
        clone[i] = obj[i];
}
return clone;
}

检查