admin管理员组文章数量:1134238
I have an array of objects that is an input. Lets call it content
.
When trying to deep copy it, it still has a reference to the previous array.
I need to duplicate that input array, and change one property of the duplicated part.
So long I've tried different methods that weren't successful.
ES6 way:
public duplicateArray() {
arr = [...this.content]
arr.map((x) => {x.status = DEFAULT});
return this.content.concat(arr);
}
The slice
way:
public duplicateArray() {
arr = this.content.slice(0);
arr.map((x) => {x.status = DEFAULT});
return this.content.concat(arr);
}
In both of them all the objects inside the array have status: 'Default'
.
What's the best approach to deep copy the array in Angular 2?
I have an array of objects that is an input. Lets call it content
.
When trying to deep copy it, it still has a reference to the previous array.
I need to duplicate that input array, and change one property of the duplicated part.
So long I've tried different methods that weren't successful.
ES6 way:
public duplicateArray() {
arr = [...this.content]
arr.map((x) => {x.status = DEFAULT});
return this.content.concat(arr);
}
The slice
way:
public duplicateArray() {
arr = this.content.slice(0);
arr.map((x) => {x.status = DEFAULT});
return this.content.concat(arr);
}
In both of them all the objects inside the array have status: 'Default'
.
What's the best approach to deep copy the array in Angular 2?
Share Improve this question asked Feb 19, 2016 at 11:33 Joel AlmeidaJoel Almeida 8,0375 gold badges27 silver badges51 bronze badges11 Answers
Reset to default 146Check this:
let cloned = source.map(x => Object.assign({}, x));
Simple:
let objCopy = JSON.parse(JSON.stringify(obj));
This Also Works (Only for Arrays)
let objCopy2 = obj.slice()
This is Daria
's suggestion (see comment on the question) which works starting from TypeScript 2.1 and basically clones each element from the array:
this.clonedArray = theArray.map(e => ({ ... e }));
This is working for me:
this.listCopy = Object.assign([], this.list);
The only solution I've found (almost instantly after posting the question), is to loop through the array and use Object.assign()
Like this:
public duplicateArray() {
let arr = [];
this.content.forEach((x) => {
arr.push(Object.assign({}, x));
})
arr.map((x) => {x.status = DEFAULT});
return this.content.concat(arr);
}
I know this is not optimal. And I wonder if there's any better solutions.
A clean way of deep copying objects having nested objects inside is by using lodash's cloneDeep method.
For Angular, you can do it like this:
Install lodash with yarn add lodash
or npm install lodash
.
In your component, import cloneDeep
and use it:
import * as cloneDeep from 'lodash/cloneDeep';
...
clonedObject = cloneDeep(originalObject);
It's only 18kb added to your build, well worth for the benefits.
I've also written an article here, if you need more insight on why using lodash's cloneDeep.
I found deep copy method in angular devkit, It's very normal, so... maybe you can just implement yourself or use that.
I prefer to use loadash, there a lot of objects and array operation methods that can use.
import { deepCopy } from '@angular-devkit/core/src/utils/object';
export class AppComponent {
source = {
....
}
constructor() {
const newObject = deepCopy(this.source);
}
}
Package Version
-----------------------------------------------------------
@angular-devkit/architect 0.1000.8
@angular-devkit/build-angular 0.1000.8
@angular-devkit/build-optimizer 0.1000.8
@angular-devkit/build-webpack 0.1000.8
@angular-devkit/core 10.0.8
@angular-devkit/schematics 10.0.8
@angular/cli 10.0.8
@ngtools/webpack 10.0.8
@schematics/angular 10.0.8
@schematics/update 0.1000.8
rxjs 6.5.5
typescript 3.9.7
webpack 4.43.0
Here is my own. Doesn't work for complex cases, but for a simple array of Objects, it's good enough.
deepClone(oldArray: Object[]) {
let newArray: any = [];
oldArray.forEach((item) => {
newArray.push(Object.assign({}, item));
});
return newArray;
}
Alternatively, you can use the GitHub project ts-deepcopy, which is also available on npm, to clone your object, or just include the code snippet below.
/**
* Deep copy function for TypeScript.
* @param T Generic type of target/copied value.
* @param target Target value to be copied.
* @see Source project, ts-deepcopy https://github.com/ykdr2017/ts-deepcopy
* @see Code pen https://codepen.io/erikvullings/pen/ejyBYg
*/
export const deepCopy = <T>(target: T): T => {
if (target === null) {
return target;
}
if (target instanceof Date) {
return new Date(target.getTime()) as any;
}
if (target instanceof Array) {
const cp = [] as any[];
(target as any[]).forEach((v) => { cp.push(v); });
return cp.map((n: any) => deepCopy<any>(n)) as any;
}
if (typeof target === 'object' && target !== {}) {
const cp = { ...(target as { [key: string]: any }) } as { [key: string]: any };
Object.keys(cp).forEach(k => {
cp[k] = deepCopy<any>(cp[k]);
});
return cp as T;
}
return target;
};
In case you need to copy an list of Objects
const newArray = originalArray.map(e => structuredClone(e));
If needed, loading the polyfill first:
import structuredClone from '@ungap/structured-clone';
See this answer for more details.
you can use use JQuery for deep copying :
var arr =[['abc'],['xyz']];
var newArr = $.extend(true, [], arr);
newArr.shift().shift();
console.log(arr); //arr still has [['abc'],['xyz']]
本文标签: javascriptDeep copy an array in Angular 2TypeScriptStack Overflow
版权声明:本文标题:javascript - Deep copy an array in Angular 2 + TypeScript - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736798546a1953385.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论