JavaScript如何从复制的对象中删除密钥?

JavaScript如何从复制的对象中删除密钥?,javascript,jquery,Javascript,Jquery,我有一个查询对象 var q = { age: 10, 'profile.contry': 'india' }; 现在,我复制q变量,并从复制变量中删除键 var duplicateQ = q; delete duplicateQ['profile.contry']; // I have removed 'profile.country' from duplicateQ. console.log(q); //Object { age: 10 } console.log(du

我有一个查询对象

var q = {
    age: 10, 
    'profile.contry': 'india'
};
现在,我复制
q
变量,并从复制变量中删除键

var duplicateQ = q;
delete duplicateQ['profile.contry']; // I have removed 'profile.country' from duplicateQ.

console.log(q); //Object { age: 10 }
console.log(duplicateQ); //Object { age: 10 }

为什么这两个变量都会受到影响?如何仅从其中一个变量中删除属性?

您不是在复制
q
,而是在复制对不同变量的引用

var duplicateQ = q;
delete duplicateQ['profile.contry']; // I have removed 'profile.country' from duplicateQ.

console.log(q); //Object { age: 10 }
console.log(duplicateQ); //Object { age: 10 }
q
duplicateQ
都指向同一对象,即计算机内存中的同一位置

为了实现这一点,您必须,然后您可以删除(/modify)单独变量上的单个属性

一个快速而肮脏的例子:

var a={a:1,b:2},
b=JSON.parse(JSON.stringify(a));
删除b.a;

document.body.textContent=JSON.stringify(a)+''+JSON.stringify(b)
这是因为
q
duplicateQ
指的是同一个对象。因此,当删除一个对象上的特性时,会同时影响两个特性(因为它们都指向同一个对象)

您需要复制/克隆对象

在ES6中,您可以使用:

输出:

console.log(q);
// {age: 10, profile.contry: "india"}

console.log(duplicateQ);
// Object {age: 10}

duplicateQ
是对原始
q
的引用。您需要克隆对象。有关详细信息,请参阅我标记为“重复”的答案。@Rorymcrossan:从技术上讲,OP是询问如何从克隆对象中删除属性。虽然“克隆”是个问题,但肯定有更好的复制品。。。(我还没找到)没错,尽管他的删除方法是正确的。我建议:(如果你同意的话,我可以申请)我同意——这个问题更一般。