HarmonyOS 鸿蒙Next中如何实现深/浅拷贝

HarmonyOS 鸿蒙Next中如何实现深/浅拷贝

  1. 浅拷贝实现方法:
    • 通过ts封装Object.assign()或者使用三方库lodash的_.clone方法。封装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%')
  }
}
  1. 深拷贝实现方法:
    • 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 key in obj) {
      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%')
  }
}

更多关于HarmonyOS 鸿蒙Next中如何实现深/浅拷贝的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS中,深拷贝和浅拷贝的实现依赖于对象的数据结构和具体需求。浅拷贝是复制对象的引用,深拷贝是复制对象的所有内容。

  1. 浅拷贝:可以通过直接赋值或使用Object.assign()方法实现。例如:

    let original = { a: 1, b: { c: 2 } };
    let shallowCopy = Object.assign({}, original);
    
  2. 深拷贝:可以使用JSON.parse(JSON.stringify())方法或递归复制对象的所有属性来实现。例如:

    let original = { a: 1, b: { c: 2 } };
    let deepCopy = JSON.parse(JSON.stringify(original));
    

对于复杂对象,递归复制更为可靠:

function deepCopy(obj) {
    if (typeof obj !== 'object' || obj === null) {
        return obj;
    }
    let copy = Array.isArray(obj) ? [] : {};
    for (let key in obj) {
        copy[key] = deepCopy(obj[key]);
    }
    return copy;
}

在实际开发中,选择深拷贝还是浅拷贝取决于是否需要复制嵌套对象的引用。

更多关于HarmonyOS 鸿蒙Next中如何实现深/浅拷贝的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)Next中,深/浅拷贝的实现方式与其他编程语言类似,主要依赖于对象的复制行为。

  1. 浅拷贝:浅拷贝只复制对象本身,不复制对象内部的引用对象。在HarmonyOS中,可以通过Object.assign()或扩展运算符{...obj}来实现浅拷贝。例如:

    let original = { a: 1, b: { c: 2 } };
    let shallowCopy = { ...original };
    
  2. 深拷贝:深拷贝会递归复制对象及其内部的所有引用对象。在HarmonyOS中,可以使用JSON.parse(JSON.stringify(obj))来实现简单的深拷贝,但这种方法不支持函数、undefined等特殊类型。对于复杂对象的深拷贝,建议使用第三方库如lodashcloneDeep方法。例如:

    let original = { a: 1, b: { c: 2 } };
    let deepCopy = JSON.parse(JSON.stringify(original));
    

选择深/浅拷贝应根据具体需求,深拷贝适用于需要完全独立的副本,而浅拷贝适用于不需要完全独立的情况。

回到顶部