2015-11-25 35 views
2

我有查询对象JavaScript如何从复制对象中删除密钥?

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 } 

为什么这两个变量都受到影响?我怎样才能从他们中的一个中删除财产?

+0

'duplicateQ'是原来的'q'参考。您需要克隆该对象。请参阅我标记为重复的答案以获取更多信息。 –

+0

@RoryMcCrossan:从技术上讲,OP会询问如何从克隆对象中删除属性。虽然“克隆”是问题,但是在那里应该有更好的重复...(不是我已经找到了一个) – Cerbrus

+1

虽然他的删除方法是正确的,但确实如此。他所遇到的问题是由这个问题来解决的。 –

回答

4

您没有复制q,而是复制对不同变量的引用。

qduplicateQ指向相同对象,在您的计算机的内存中的相同位置。

为了使这项工作,你将不得不clone the object,然后你可以删除(/修改)单独的变量的个别属性。

快速和肮脏的例子:

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

 
delete b.a; 
 

 
document.body.textContent = JSON.stringify(a) + ' ' + JSON.stringify(b);

2

这是因为qduplicateQ指向同一个对象。因此,当你在一个对象上删除一个属性时,它会影响到这两个属性(因为它们都指向同一个对象)。

您需要拷贝/克隆的对象。

在ES6,你可以使用.assign() method

var q = {age:10, 'profile.contry': 'india'}; 
var duplicateQ = Object.assign({}, q); 
delete duplicateQ['profile.contry']; 

输出:

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

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

感谢它的作品:) –