从对象中删除所有属性

新手上路,请多包涵

我有这个 Javascript 对象。

 req.session

在我的代码中,我向该对象添加了属性。这些属性可以是其他对象、数组或只是普通字符串。

 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;

原文由 Anders Östman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

该问题有两种可能的解决方案:

分配一个空对象

req.session = {};

垃圾收集器会自动清理内存。这个变体非常快,并且在大多数情况下都可以工作,但是,您需要 谨慎 使用它,因为它可能会将对对象的引用保留在内存中。此警告在下面的 TLDR 部分中进行了描述。

逐一删除属性

Object.keys(object).forEach(key => delete object[key]);

这将通过遍历每个非原型属性并将其删除来清理对象。它更安全但更慢。您需要确定在特定情况下使用它是否有意义。


TLDR

上面给出的任何解决方案都将在当前情况下为作者完成工作,以及该问题中提供的任何其他有效解决方案。这主要取决于开发人员希望如何操作已弃用数据的方式。

会话对象可能包含由不同变量链接的数据,将新的空对象设置为 req.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}

req.session = {};                          // let's replace session with a new object
console.log( req.session, session );       // {}, {user: Object}

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

使用以下方法深度清洁物体:

 Object.keys(object).forEach(key => delete object[key]);

… 将从 req.session 对象中 显式 删除所有值,因为 session 变量链接到同一对象, 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(key => delete req.session[key]);
console.log( req.session, session );       // {}, {}

正如您现在看到的,在这两种情况下我们都得到空对象。

从速度和内存的角度来看,设置一个新的空对象比一个接一个地清理旧对象的属性 _要快得多_,但是如果旧数据仍然在某处引用,那么在内存方面,新对象方法不会释放旧数据所占用的内存消费。

很明显,选择采用的方法主要取决于您的编码方案,但在大多数情况下 req.session = {}; 可以完成工作:它又快又短。但是,如果您在其他变量中保留对原始对象的引用,您可以考虑使用深度隐式对象属性删除。

原文由 VisioN 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您想清除该特定引用,@VisioN 的答案有效,但如果您真的想清除一个对象,我发现这有效:

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

原文由 Dave Lugg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题