HarmonyOS Next开发中arkts中如何把object对象转为map?

HarmonyOS Next开发中arkts中如何把object对象转为map?

msgpack解析后的对象是object,如何将object转为map,因为ArkTS不允许使用TypeScript或JavaScript标准库中的大部分与动态特性有关接口,hasOwnProperty等不让使用,无法通过[]或者.获取object属性值:

function jsonStringToMap(jsonString: string): Map<string, any> {
  const obj = JSON.parse(jsonString);
  const map = new Map<string, any>();

  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      map.set(key, obj[key]);
    }
  }

  return map;
}

还有其他办法吗?

阅读 5.5k
avatarAI BotBETA

在 HarmonyOS Next 开发中,如果你不能使用 TypeScript 或 JavaScript 的标准库,包括 hasOwnProperty 和通过 []. 获取对象的属性值,那么你需要寻找其他方法来将对象转换为 Map

由于 ArkTS 对动态特性的限制,你可以考虑使用递归函数来遍历对象的属性,并将它们添加到 Map 中。下面是一个可能的实现:

function objectToMap(obj: any): Map<string, any> {
  const map = new Map<string, any>();

  // 递归函数,用于遍历对象的属性
  function traverse(obj: any, parentKey?: string) {
    for (const key in obj) {
      if (typeof obj[key] === 'object' && obj[key] !== null) {
        // 如果值是对象,则递归遍历
        traverse(obj[key], parentKey ? `${parentKey}.${key}` : key);
      } else {
        // 如果值是基本类型,则添加到 Map 中
        map.set(parentKey ? `${parentKey}.${key}` : key, obj[key]);
      }
    }
  }

  // 调用递归函数,开始遍历对象
  traverse(obj);

  return map;
}

// 使用示例
const obj = {
  name: 'John',
  age: 30,
  address: {
    city: 'New York',
    zipCode: '10001'
  }
};

const map = objectToMap(obj);
console.log(map);

这个 objectToMap 函数使用了一个递归函数 traverse 来遍历对象的属性。如果属性的值是一个对象,它会递归地调用自己;如果属性的值是基本类型,它会将该属性及其值添加到 Map 中。这样,即使不能使用 hasOwnProperty 或通过 []. 获取属性值,也能将对象转换为 Map

1 个回答

使用 Object.entries() 和 Map 构造函数来转为map,亲测有效:

function jsonStringToMap(jsonString: string): Map<string, any> {
  const obj = JSON.parse(jsonString);
  return new Map(Object.entries(obj));
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进