从对象中删除所有属性

我有这个Javascript对象。

req.session 

在我的代码中,我添加属性到这个对象。 这些属性可以是其他对象,数组或简单的string。

 req.session.savedDoc = someObject; req.session.errors = ['someThing', 'anotherThing', 'thirdThing']; req.session.message = 'someString' 

如果我后来想删除这个对象的所有附加属性,什么是最简单/最好的方法?

一定有比这更好的办法吗?

 // Delete all session values delete req.session.savedDoc; delete req.session.errors; delete req.session.message; 

简单地分配一个空的对象:

 req.session = {}; 

…和垃圾收集器将自动完成剩下的工作。


更新:由于这个答案是有争议的,我想提供一些关于这一点的更多细节。

上面给出的解决scheme将为目前情况下的作者提供工作,以及此问题提供的任何其他有效的解决scheme。 它主要取决于开发人员如何操作不推荐使用的数据。

会话对象可能包含由不同variables链接的数据,并且将新的空对象设置为req.session不会req.session旧数据的引用,因此旧数据在仍然需要的地方可用。 尽pipe保留旧数据的正确方法是克隆初始对象,但真实情况可能不同。 我们来看下面的例子:

 req.session.user = { name: 'Alexander' }; // we store an object in the session var session = req.session; // save reference to the session in a variable console.log( req.session, session ); // {user: Object}, {user: Object} req.session = {}; // let's replace session with a new object console.log( req.session, session ); // {}, {user: Object} 

我们仍然可以从sessionvariables中提取旧数据,但是req.session是空的:这里设置一个新的对象可以作为深层克隆的替代方法。 垃圾回收器不会从旧的req.session对象中删除数据,因为它仍然被sessionvariables引用。

使用@Dave提供的方法深入清理对象,或通过Object.keys (忽略原型链中的属性,不需要用于node.js的垫片)更短:

 Object.keys(object).forEach(function(key) { delete object[key]; }); 

…将显式移除req.session对象中的所有值,并且因为sessionvariables链接到相同的对象,所以session也将变为空。 让我们看看它是如何工作的:

 req.session.user = { name: 'Alexander' }; // we store an object in the session var session = req.session; // save reference to the session in a variable console.log( req.session, session ); // {user: Object}, {user: Object} Object.keys(req.session).forEach(function(key) { delete req.session[key]; }); console.log( req.session, session ); // {}, {} 

正如你现在看到的,在这两种情况下,我们都得到空的物体。

从速度和内存的angular度来看,设置新的空对象将比按属性清理旧的对象属性要快得多 ,但是如果旧数据仍然在某处引用,那么内存明智地使用新对象方法将不会释放旧数据消耗的内存。

很明显,select采取的方法主要取决于您的编码scheme,但在大多数情况下, req.session = {}; 会做的工作:这是快速和短暂的。 但是,如果在其他variables中保留对原始对象的引用,则可以考虑使用深度隐式对象属性删除。

@ VisioN的答案如果你想清除特定的引用,但如果你真的想清除一个对象,我发现这个工程:

 for (var variableKey in vartoClear){ if (vartoClear.hasOwnProperty(variableKey)){ delete vartoClear[variableKey]; } } 

我只能看到从对象中删除自己的属性只有一个正确的解决scheme:

 for (var x in objectToClean) if (objectToClean.hasOwnProperty(x)) delete objectToClean[x]; 

如果你想多次使用它,你应该创build一个清理函数:

 function deleteProperties(objectToClean) { for (var x in objectToClean) if (objectToClean.hasOwnProperty(x)) delete objectToClean[x]; } 

对于你的情况使用将是:

 deleteProperties(req.session); 

这个解决scheme从所引用的对象中删除属性,并保留旧的引用。
例:
使用空对象分配:

 var x = {a: 5}; var y = x; x = {}; // x will be empty but y is still {a: 5}, also now reference is gone: x !== y 

使用清洁方法:

 var x = {a: 5}; var y = x; deleteProperties(x); // x and y are both empty and x === y 

如果你想删除所有的属性,而不触摸方法,你可以使用:

 for(var k in req.session) if(!req.session[k].constructor.toString().match(/^function Function\(/)) delete req.session[k]; 

我已经这样做了

 var i, keys = Object.keys(obj); for(i = 0; i < keys.length; i++){ delete obj[keys[i]]; } 

你可以将它添加到Object(原型在这里不理想) – 将是静态的。

 Object.defineproperties(Object, { 'clear': function(target){ var i, keys = Object.keys(target); for(i = 0; i < keys.length; i++){ delete target[keys[i]]; } } }); 

然后你可以清除随机对象

 Object.clear(yourObj); 

yourObj = {}将引用replace为一个新的对象,上面的删除它的属性 – 引用是相同的。