HarmonyOS 鸿蒙Next中对象合并

HarmonyOS 鸿蒙Next中对象合并 1.自定义assign方法

function assign(target: Record<string, Object>, ...source: Object[]): Record<string, Object> {
  for (const items of source) {
    for (const key of Object.keys(items)) {
      target[key] = Reflect.get(items, key)
    }
  }
  return target;
}

2.使用assign方法

interface IMergeSub {
  testString: string,
  testObject?: IMergeSub,
  testArray?: Array<number>
}

interface IMerge {
  a: IMergeSub,
  b: IMergeSub[],
  c: string[],
  d: number
}

export function testAssign() {
  let objectOne: IMerge =
    {
      a: {
        testString: 'objectOne-a-testString',
        testObject: {
          testString: 'objectOne-a-testObject-testString'
        },
        testArray: [1]
      },
      b: [{
        testString: 'objectOne-b-testString',
        testObject: {
          testString: 'objectOne-b-testObject-testString'
        },
        testArray: [2]
      }],
      c: ['objectOne-c'],
      d: 3
    }

  let objectTwo: Record<string, Object> = {
    'a': 'objectTwo-a',
    'c': ['objectTwo-c'],
    'e': 1
  }

  let objectThree: Record<string, Object> = {
    'f': ['objectThree-f']
  }

  // 合并多个对象,ObjectOne和ObjectTwo的属性都将附加到ObjectThree上,属性名相同时入参下标靠后的对象属性覆盖前面的对象属性 
  const multiObjectMerged = assign(objectThree, objectTwo, objectOne);
  console.log('multiObjectMerged is:' + JSON.stringify(multiObjectMerged));
  console.log('objectThree is:' + JSON.stringify(objectThree));

  // 合并ObjectOne的属性到ObjectTwo,ObjectTwo的值会改变,属性名称相同时ObjectOne会覆盖ObjectTwo的属性 
  const objectMerged = assign(objectTwo, objectOne);
  console.log('objectTwo is:' + JSON.stringify(objectTwo));
  console.log('objectMerged is:' + JSON.stringify(objectMerged));
}

更多关于HarmonyOS 鸿蒙Next中对象合并的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

鸿蒙Next中对象合并使用Object.assign()方法实现。该方法将源对象的所有可枚举属性复制到目标对象,返回合并后的对象。若存在相同属性名,后续源对象的属性值会覆盖之前的。此方法适用于浅拷贝场景,不处理嵌套对象的深度合并。

更多关于HarmonyOS 鸿蒙Next中对象合并的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,对象合并可以通过自定义的assign方法实现,该方法支持浅拷贝合并多个对象。从代码示例来看,该方法使用Reflect.get获取属性值,并直接赋值给目标对象,因此对于嵌套对象或数组,不会进行深拷贝,而是引用复制。

需要注意,当源对象包含复杂类型(如嵌套对象或数组)时,修改合并后的对象可能会影响原始对象,因为属性是共享的。如果需要进行深拷贝合并,建议使用递归方式或第三方库(如lodash的merge方法)来处理嵌套结构。

此外,TypeScript接口定义有助于类型检查,但在运行时仍需注意属性覆盖逻辑,确保符合预期行为。

回到顶部