当前位置: 首页 > 面试题库 >

在Node.js中克隆对象

孙修德
2023-03-14
问题内容

在node.js中克隆对象的最佳方法是什么

例如,我想避免以下情况:

var obj1 = {x: 5, y:5};
var obj2 = obj1;
obj2.x = 6;
console.log(obj1.x); // logs 6

该对象很可能包含复杂的类型作为属性,因此简单的for(var1 in obj1)无法解决。我需要自己编写一个递归克隆吗,还是内置了一些我看不到的东西?


问题答案:

可能性1

简洁的深层副本:

var obj2 = JSON.parse(JSON.stringify(obj1));

可能性2(已弃用)

注意:
现在,Node.js文档中将该解决方案标记为不推荐使用:

从未打算在内部Node.js模块之外使用util._extend()方法。社区仍然找到并使用了它。

它已被弃用,不应在新代码中使用。JavaScript通过Object.assign()具有非常相似的内置功能。

原始答案

对于浅表副本,请使用Node的内置util._extend()功能。

var extend = require('util')._extend;

var obj1 = {x: 5, y:5};
var obj2 = extend({}, obj1);
obj2.x = 6;
console.log(obj1.x); // still logs 5

Node
_extend函数的源代码在这里:https
:
//github.com/joyent/node/blob/master/lib/util.js

exports._extend = function(origin, add) {
  // Don't do anything if add isn't an object
  if (!add || typeof add !== 'object') return origin;

  var keys = Object.keys(add);
  var i = keys.length;
  while (i--) {
    origin[keys[i]] = add[keys[i]];
  }
  return origin;
};


 类似资料:
  • 问题内容: 如果克隆数组,我将使用 我想知道如何在nodejs中克隆对象。 问题答案: 对于不需要压缩每一滴性能的实用程序和类,我经常作弊,只是使用JSON执行深层复制: 这不是唯一的答案,也不是最优雅的答案。所有其他答案都应考虑成为生产瓶颈。但是,这是一个快速而肮脏的解决方案,非常有效,并且在大多数情况下(我会克隆属性的简单哈希值)很有用。

  • 我试图在RecyclerView使用的ArrayList中创建一个对象的克隆,我已经用Clonable扩展了我的实体,但是当我编辑克隆的对象时,甚至修改了原始对象。 什么将是正确的方式来克隆/复制一个对象在回收器视图? 实体: 实体变量: 活动: 然后,当一个RecyclerView项目被滑动时,将该位置传递到一个修改对话框,在该对话框中,我可以对该对象进行一些编辑。 编辑: 通过深入研究,我发现

  • 假设我有这门课: 以及子类: 我知道这是不可能的,但我想你明白我想要什么。如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。我想我想要但不允许的是: 如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。 除了扩展的抽象类,我怎么能做到“相同”?

  • 我正试图用OptaPlanner解决时间表问题,但我面临的问题可能与克隆问题有关。为什么我的计划实体收集方法看起来像这样 我犯错了 但是,当方法看起来像 一切都还好。有什么理由呢?为什么我会出现这个错误?谢谢你的帮助。

  • 问题内容: 我想知道是否有任何方法可以执行以下操作。我有一个抽象类,及其所有不同的子类,我想覆盖clone方法。我要在方法中做的就是从当前方法中创建一个新方法。显然,由于抽象,我无法执行以下操作。还有另一种方法可以执行此操作,因为仅为了简单的名称更改而在每个子类中覆盖克隆似乎没有用。 问题答案: 您可以尝试使用反射: } 在clone()方法中,调用getClass()。因为ACloneble i

  • 我有下面的java代码,当我稍后尝试访问MiscDoc对象时,它似乎是空的。我找不到答案。NotesDocument上的clone()方法。 if语句只被访问一次 我该如何解决这个问题