如何在鸿蒙HarmonyOS下的ArkTS如何实现深/浅拷贝
- 浅拷贝实现方法:
通过ts封装Object.assign()或者使用三方库lodash的_.clone方法。封装Object.assign()示例如下:
ts封装Object.assign():
export class ObjectUtil { static Assign<T extends {}, U>(target: T, source: U): T & U { return Object.assign(target, source); } }
ets文件中使用封装的ObjectUtil:
import { ObjectUtil } from './utils'; interface InnerStudent { age: number, score: number } interface Student { name: string, data: InnerStudent } let obj1: Student = { name: 'obj1', data: { age: 24, score: 100 } }; let obj2 = ObjectUtil.Assign({}, obj1); obj2.name = 'obj2'; obj2.data.age = 12; obj2.data.score = 50; @Entry @Component struct Index { build() { Row() { Column() { Button('get obj') .onClick(() => { console.log('obj1:', JSON.stringify(obj1)); // obj1: {"name":"obj1","data":{"age":12,"score":50}} console.log('obj2:', JSON.stringify(obj2)); // obj2: {"name":"obj2","data":{"age":12,"score":50}} }) } .width('100%') }.height('100%') } }
- 深拷贝实现方法:
- JSON.parse(JSON.stringify()),对于undefined等无法序列化的数据会丢失。
- 三方库lodash的_.cloneDeep方法。
- 手写递归方法:
// ts中封装工具函数 export function deepCopy(obj: ESObject): ESObject { if (typeof obj !== 'object' || obj === null) { return obj; } let copy: ESObject; if (Array.isArray(obj)) { copy = []; for (let i = 0; i < obj.length; i++) { copy[i] = deepCopy(obj[i]); } } else { copy = {}; for (let i = 0; i < obj.length(); i++) { let key: ESObject = obj[i]; if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); } } } return copy; }
// 使用封装的工具函数 import { deepCopy } from './utils'; let arr1:Array<number> = new Array<number>(1, 2, 3); let arr2:Array<number> = deepCopy(arr1); arr2[0] = 4; arr2[1] = 5; arr2[2] = 6; @Entry @Component struct Index { build() { Row() { Column() { Button('deep copy') .onClick(() => { console.log('arr1:', JSON.stringify(arr1)); // arr1: [1,2,3] console.log('arr2:', JSON.stringify(arr2)); // arr2: [4,5,6] }) } .width('100%') }.height('100%') } }