【问题标题】:I am finding it difficult to clone an object in Javascript [closed]我发现很难在 Javascript 中克隆对象 [关闭]
【发布时间】:2021-07-23 08:04:01
【问题描述】:

我有一个网络应用程序,用户可以在其中点击一个按钮来copy 一个引擎对象。

我用 Javascript 编写了下面的方法,它可以工作。但是,如果克隆的用户超过 2 或 3 个,则会弹出随机错误。例如,它会说,Engine is undefinedengineToClone is undefined

但如果只有一个人在做,它永远不会出错。

所以我想知道是否有更好的方法来写这个:

    var engineToClone = this.model;

    var clonedEngine = new Engine({
        factoryId: engineToClone.attributes.factoryId,
        title: 'CLONED OF - ' + engineToClone.attributes.title,
        engineDescription: engineToClone.attributes.engineDescription,
        isFrontend: engineToClone.attributes.isFrontend,
        cylinders: engineToClone.cylinders,
        headers: engineToClone.headers,
        vehicles: engineToClone.vehicles,
        pistons: engineToClone.pistons,
        fuels: engineToClone.fuels
    });
    
    clonedEngine.save(null, {
        url: self.factory.url()
    }).done(function () {
    });

我试过这样做,但它会生成空值:

    var engineToClone = this.model;

    var clonedEngine = engineToClone;

但是 clonedEngine 总是返回为 null。

我也在这里阅读了使用 json 的答案,所以我尝试了这个:

JSON.parse(JSON.stringify(engineToClone))

但它总是说 JSON 未定义。

所以我一定是做错了什么,我希望有人能指出我正确的方向。

谢谢!

【问题讨论】:

  • JSON 未定义?您使用的是什么运行时/浏览器?你在使用兼容模式吗?
  • @JacobLockwood 谢谢,我正在使用最新版本的火狐。它处于兼容模式。
  • 那一定是你的问题... 在兼容模式下,JSON 没有定义,因为它在 IE 7 及更低版本中不受支持。只需关闭兼容模式即可。

标签: javascript ecmascript-6


【解决方案1】:

Object.assign() 方法将所有可枚举的自身属性从一个或多个源对象复制到目标对象。它返回目标对象。 读这个: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

【讨论】:

  • 谢谢您,您知道如果需要它是否可以排除某个属性吗?就像我不想复制 ID 一样
  • 我不确定...我是 javascript 的初学者,但我在“复制”之后可以删除任何不需要的属性。
【解决方案2】:

JSON 未定义很奇怪,但还有另一个解决方案使用 Object.assign()。基本上,它从原始对象中获取每个属性并将其复制到{}

const myObject = {
  some: "properties",
  that: "could",
  be: "cloned",
}

let clone = Object.assign({}, myObject);

myObject.x = 
  "the original was edited... what happens to the clone?";

console.log(clone);

请注意,这是一个“浅拷贝”。如果myObject 有嵌套对象,并且这些对象稍后被编辑,则副本也会受到影响。如果您需要“深拷贝”,您应该使用JSON.parse(JSON.stringify(object)) 解决方案。


如果你需要复制除少数之外的所有属性,你可以使用这个:

const clone = (obj, ...ignore) => {
  let copy = Object.assign({}, obj); //copy the object
  for (var i of ignore) delete copy[i]; //delete everything from ignore
  return copy; //return what's left (the good bits)
};

var myObject = { key: "value", a: "b", id: "theId" };
var myClone = clone(myObject, "id");

console.log(myClone);

【讨论】:

  • 谢谢 Jacob,您知道 JSON.parse 或 Object.assign 解决方案是否可以排除属性吗?我在数据库中分配了一个属性,即 Id。再次感谢您。
  • 这是一个有趣的巧合。我只是在寻找这个确切的问题,这就是我找到这个解决方案的方式。有一些很棒的解决方案here。我现在将在我的帖子中添加一个。
  • 看起来不错! ignore 是什么属性?因此,当您传入id 时,它将忽略名称为id 的属性?谢谢!
  • ...ignorerest parameter。因此,您可以根据需要向clone() 传递任意数量的键,它们将被解释为一个名为ignore 的数组,可以使用for...of 循环对其进行迭代。
猜你喜欢
  • 2019-03-21
  • 2011-07-18
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2013-11-14
  • 2016-08-01
  • 2012-02-26
  • 2014-01-11
相关资源
最近更新 更多