HarmonyOS 鸿蒙Next:Object.assign方法用什么方法可以替换

发布于 1周前 作者 sinazl 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:Object.assign方法用什么方法可以替换

【关键字】

Object.assign方法 / ArkTS / assign方法

【问题描述】

Object.assign方法是不让用了吗,用什么方法可以替换。

代码:

public static assign<T, U>(target: T, source: U): void {
Object.assign<T, U>(target, source)}

错误信息:

ERROR: ArkTS:ERROR File: C:/Users/**/StudioProjectsNew/Harmony/Paotui/uuSystemBase/src/main/ets/com/uupt/util/UuObjectUtils.ets:9:19
Type ‘T’ does not satisfy the constraint ‘{}’.
ERROR: ArkTS:ERROR File: C:/Users/**/StudioProjectsNew/Harmony/Paotui/uuSystemBase/src/main/ets/com/uupt/util/UuObjectUtils.ets:9:5Usage of standard library is restricted (arkts-limited-stdlib) 

【解决方案】

出于性能考虑,目前ArkTS限制了ES6的Object.assign()方法的使用。若需要在ets文件中扩展对象属性或合并两个对象时,可以自行实现assign方法。

自定义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;
} 

具体使用可参考:

https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-arkts-kit-0000001816452241


更多关于HarmonyOS 鸿蒙Next:Object.assign方法用什么方法可以替换的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复
// 封装方法
// 对象合并
assignFn(target: object,...source:object[]){
// 获取目标对象和第一个源对象的键数组
const targetKeys = Object.keys(target);
const sourceKeys = Object.keys(source[0]);

// 比较长度,确定使用哪个对象的键来进行遍历赋值
if (targetKeys.length > sourceKeys.length) {
for (let key of targetKeys) {
if (source[0][key]) {
target[key] = source[0][key];
} else {
target[key] = target[key];
}
}
} else {
for (let items of source) {
for (let key of Object.keys(items)) {
target[key] = source[key];
}
}
}
return target;
}

// 调用

assignFn({a:1},{a:2,b:1})

更多关于HarmonyOS 鸿蒙Next:Object.assign方法用什么方法可以替换的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用其他方式来实现对象的属性合并或复制操作

### 1. 手动属性复制

通过简单的循环或者使用扩展操作符来手动复制对象属性。

- **使用扩展操作符 (`...`)**:

const source = { a: 1, b: 2 };
const target = { ...source };<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

  这种方法会复制 `source` 对象的所有属性到 `target` 对象中。

- **手动循环复制**:

 const source = { a: 1, b: 2 };

  const target = {};

  for (let key in source) {

    if (source.hasOwnProperty(key)) {

      target[key] = source[key];

    }

  }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

 

  这种方法逐个复制源对象的属性到目标对象中,确保只复制自身属性。

### 2. 对象.assign (polyfill)

考虑使用一个 polyfill(兼容性补丁),它模拟 Object.assign 的行为:

if (typeof Object.assign !== ‘function’) {

  // Polyfill for Object.assign

  Object.assign = function(target, …sources) {

    if (target == null) {

      throw new TypeError(‘Cannot convert undefined or null to object’);

    }

    const to = Object(target);

    for (let i = 0; i < sources.length; i++) {

      const nextSource = sources[i];

      if (nextSource != null) {

        for (const nextKey in nextSource) {

          if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {

            to[nextKey] = nextSource[nextKey];

          }

        }

      }

    }

    return to;

  };

}<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

### 3. 第三方库

另一种替代方法是使用第三方库,如 Lodash,它提供了丰富的实用工具函数,包括用于对象操作的方法:

- 使用 Lodash

  const _ = require(‘lodash’);

  

  const source = { a: 1, b: 2 };

  const target = _.assign({}, source);<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

  这样可以使用 Lodash 的 _.assign 方法来完成对象属性的合并。

在HarmonyOS鸿蒙Next环境中,如果你需要替换Object.assign方法,可以考虑以下几种替代方案:

  1. 展开运算符(Spread Operator): 使用展开运算符...可以直接将一个或多个源对象的所有可枚举属性复制到目标对象中。这是Object.assign的一个简洁替代。

    const target = {};
    const source1 = { a: 1 };
    const source2 = { b: 2 };
    const result = { ...target, ...source1, ...source2 };
    
  2. 手动遍历属性: 你可以通过for...in循环手动遍历源对象的属性,并将其复制到目标对象中。这种方法更加灵活,可以处理一些特殊情况。

    const target = {};
    const source = { a: 1, b: 2 };
    for (let key in source) {
        if (source.hasOwnProperty(key)) {
            target[key] = source[key];
        }
    }
    
  3. 使用第三方库: 如果项目中已经引入了某些工具库(如Lodash),你可以利用这些库提供的对象合并功能,如_.merge_.assign,来替代Object.assign

以上方法可以在大多数情况下替代Object.assign,实现相同的功能。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部