从对象中删除所有属性
我有这个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}
我们仍然可以从session
variables中提取旧数据,但是req.session
是空的:这里设置一个新的对象可以作为深层克隆的替代方法。 垃圾回收器不会从旧的req.session
对象中删除数据,因为它仍然被session
variables引用。
使用@Dave提供的方法深入清理对象,或通过Object.keys
(忽略原型链中的属性,不需要用于node.js的垫片)更短:
Object.keys(object).forEach(function(key) { delete object[key]; });
…将显式移除req.session
对象中的所有值,并且因为session
variables链接到相同的对象,所以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为一个新的对象,上面的删除它的属性 – 引用是相同的。