javascript - 我发现很难在 Javascript 中克隆对象
问题描述
我有一个网络应用程序,用户可以在其中点击copy
引擎对象的按钮。
我用Javascript编写了下面的方法,它可以工作。但是,如果克隆的用户超过 2 或 3 个,则会弹出随机错误。例如,它会说,Engine is undefined
或engineToClone 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 总是返回为空。
我还在这里阅读了使用 json 的答案,所以我尝试了这个:
JSON.parse(JSON.stringify(engineToClone))
但它总是说 JSON 是未定义的。
所以我一定是做错了什么,我希望有人能指出我正确的方向。
谢谢!
解决方案
奇怪的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);
推荐阅读
- c# - 在使用 Expression 创建的 List 上调用 Select 方法,并在 Select 方法中使用传递的 Func<>
- google-apps-script - 锁定服务在使用 Apps 脚本的 Google 表格中不起作用
- typescript - 尽管在 .eslintrc.js 中提到了规则,但导入错误
- asp.net-core - nginx 作为反向代理会丢失 cookie
- flutter - 在颤动中截屏时出现黑屏
- mysql - SQLSTATE [42S02]:未找到基表或视图:1146 表 'dream.category_course' 不存在
- python - Python 代码适用于解释器,但在我使用 pyinstaller 时不起作用
- c# - 如何在 Azure 应用服务中升级 .Net 框架之前或之后维护应用程序
- python - 如何绘制跨基因组坐标的 log2 倍数变化(使用 Deseq2 输出 csv)
- revit-api - 无法在 Revit 文件的视图中隐藏元素类别