什么';s angular的替代品。在angular中复制
如何复制一个对象并丢失其在角度中的引用 在AngularJS中,我可以使用什么';s angular的替代品。在angular中复制,angular,Angular,如何复制一个对象并丢失其在角度中的引用 在AngularJS中,我可以使用angular.copy(object),但在angular中使用它会出现一些错误 异常:参考错误:角度未定义 假设您使用的是ES6,您可以使用var copy=Object.assign({},original)。在现代浏览器中工作;如果您需要支持较旧的浏览器,请查看此 更新: 对于TypeScript 2.1+,ES6速记对象扩展符号可用: const copy={…original} 在我们找到更好的解决方案之前,您
angular.copy(object)
,但在angular中使用它会出现一些错误
异常:参考错误:角度
未定义
假设您使用的是ES6,您可以使用
var copy=Object.assign({},original)
。在现代浏览器中工作;如果您需要支持较旧的浏览器,请查看此
更新:
对于TypeScript 2.1+,ES6速记对象扩展符号可用:
const copy={…original}
在我们找到更好的解决方案之前,您可以使用以下方法:
duplicateObject = <YourObjType> JSON.parse(JSON.stringify(originalObject));
duplicateObject=JSON.parse(JSON.stringify(originalObject));
编辑:澄清
请注意:上述解决方案仅适用于Angular 2正在积极开发时提供的快速修复单衬套。我的希望是我们最终可能会得到一个相当于angular.copy()
。因此,我不想编写或导入深度克隆库
此方法还存在解析日期属性的问题(它将成为字符串)
请不要在生产应用程序中使用此方法。仅在你的实验项目中使用它-你正在学习Angular 2的项目。如bertandg所示使用lodash。angular不再具有此方法的原因是angular 1是一个独立的框架,外部库经常遇到angular执行上下文的问题。Angular 2没有这个问题,所以使用您想要的任何库
对于浅层复制,您可以使用Object.assign,这是ES6功能
let x = { name: 'Marek', age: 20 };
let y = Object.assign({}, x);
x === y; //false
不要将其用于深度克隆如果要复制类实例,也可以使用Object.assign,但需要将新实例作为第一个参数传递(而不是{}):
正如其他人已经指出的,使用lodash或下划线可能是最好的解决方案。但是,如果您不需要这些库来做任何其他事情,您可能可以使用以下内容:
function deepClone(obj) {
// return value is input is not an Object or Array.
if (typeof(obj) !== 'object' || obj === null) {
return obj;
}
let clone;
if(Array.isArray(obj)) {
clone = obj.slice(); // unlink Array reference.
} else {
clone = Object.assign({}, obj); // Unlink Object reference.
}
let keys = Object.keys(clone);
for (let i=0; i<keys.length; i++) {
clone[keys[i]] = deepClone(clone[keys[i]]); // recursively unlink reference to nested objects.
}
return clone; // return unlinked clone.
}
功能深度克隆(obj){
//返回值为输入不是对象或数组。
if(typeof(obj)!='object'| | obj===null){
返回obj;
}
让我们克隆;
if(数组isArray(obj)){
clone=obj.slice();//取消数组引用的链接。
}否则{
clone=Object.assign({},obj);//取消对象引用的链接。
}
让keys=Object.keys(克隆);
对于(设i=0;i我发现的最简单的解决方案是:
let yourDeepCopiedObject = _.cloneDeep(yourOriginalObject);
*重要步骤:
您必须安装lodash才能使用此选项(其他答案不清楚):
然后将其导入ts文件:
import * as _ from "lodash";
深度复制包含嵌套对象的对象的替代方法是使用lodash的cloneDeep方法
对于Angular,您可以这样做:
function deepClone(obj) {
// return value is input is not an Object or Array.
if (typeof(obj) !== 'object' || obj === null) {
return obj;
}
let clone;
if(Array.isArray(obj)) {
clone = obj.slice(); // unlink Array reference.
} else {
clone = Object.assign({}, obj); // Unlink Object reference.
}
let keys = Object.keys(clone);
for (let i=0; i<keys.length; i++) {
clone[keys[i]] = deepClone(clone[keys[i]]); // recursively unlink reference to nested objects.
}
return clone; // return unlinked clone.
}
使用纱线添加lodash安装lodash
或npm安装lodash
在组件中,导入cloneDeep
并使用它:
import { cloneDeep } from "lodash";
...
clonedObject = cloneDeep(originalObject);
您的构建只增加了18kb,这是值得的
我还写了一篇文章,如果你需要更深入的了解为什么要使用lodash的cloneDeep。我需要这个功能,只需要从我的应用程序“模型”(原始后端数据转换为对象)开始。因此我最终使用了(从指定原型创建新对象)和(在对象之间复制属性)的组合。需要手动处理深度复制。我为此创建。也有同样的问题,不想使用任何插件进行深度克隆:
static deepClone(object): any {
const cloneObj = (<any>object.constructor());
const attributes = Object.keys(object);
for (const attribute of attributes) {
const property = object[attribute];
if (typeof property === 'object') {
cloneObj[attribute] = this.deepClone(property);
} else {
cloneObj[attribute] = property;
}
}
return cloneObj;
}
静态深度克隆(对象):任意{
const cloneObj=(,请检查以下功能的例外情况我已经创建了一个用于Angular 5或更高版本的服务,它使用angularjs的基础Angular.copy()
,对我来说效果很好。此外,还有其他功能,如未定义的,等等。我希望能有所帮助。
像任何优化一样,很高兴知道。敬请
从'@angular/core'导入{Injectable};
@可注射({providedIn:'root'})
导出类角度服务{
私有类型的_数组_REGEXP=/^\[对象(?:Uint8 | uint8clipped | Uint16 | Uint32 | Int16 | Int32 | Float64)数组\$/;
私有stackSource=[];
私有stackDest=[];
构造函数(){}
公共isNumber(值:任意):布尔值{
if(typeof value==='number'){返回true;}
else{return false;}
}
公共isTypedArray(值:任意){
返回值&this.isNumber(value.length)和&this.TYPED_ARRAY_REGEXP.test(toString.call(value));
}
公共isArrayBuffer(对象:任何){
返回字符串调用(obj)='[object ArrayBuffer]';
}
public未定义(value:any){return typeof value=='undefined';}
public isObject(value:any){返回值!==null&&typeof值===='object';}
public isBlankObject(值:any){
返回值!==null&&typeof值==='object'&&!object.getPrototypeOf(值);
}
public isFunction(value:any){return typeof value==='function';}
公共setHashKey(obj:any,h:any){
如果(h){obj.$$hashKey=h;}
else{delete obj.$$hashKey;}
}
私有isWindow(obj:any){return obj&&obj.window===obj;}
私有isScope(obj:any){return obj&&obj.$evalAsync&&obj.$watch;}
私有copyRecurse(源:任意,目标:任意){
const h=目的地。$$hashKey;
if(Array.isArray(源)){
for(设i=0,ii=source.length;istatic deepClone(object): any {
const cloneObj = (<any>object.constructor());
const attributes = Object.keys(object);
for (const attribute of attributes) {
const property = object[attribute];
if (typeof property === 'object') {
cloneObj[attribute] = this.deepClone(property);
} else {
cloneObj[attribute] = property;
}
}
return cloneObj;
}
copyFactory = (() ->
resource = ->
resource.__super__.constructor.apply this, arguments
return
this.extendTo resource
resource
).call(factory)
let newObj = JSON.parse(JSON.stringify(obj))
this.assignCustomerList = Object.assign([], this.customerList);
this.assignCustomer = Object.assign({}, this.customer);
npm install clone