dart - 将 Dart 2 Map 动态转换为 Javascript 对象

标签 dart dart-js-interop

我正在使用新的 js 包和 dart 2 SDK 围绕 chrome.storage.local.set 编写自定义 dart 与 js 互操作。

Dart 中的 Map 与 JavaScript 中的对象不同,但是强制开发人员在每次想要使用面向公众的 API 时都编写抽象类也是不正确的。

因此,我正在寻找一种将 dart Map 转换为不需要编写抽象类的 JavaScript 对象的方法。

使用 dart:js 很容易将 dart Map 转换为 JS 对象,但是使用新的 js 包我还没有看到任何动态将 dart Map 转换为 js 的示例对象。

最佳答案

已接受答案的略微修改版本,它还处理嵌套 map 。我还添加了一个解决方案,用于转换另一种方式:从 Javascript 对象到 Dart Map。

import 'package:js/js.dart';
import 'package:js/js_util.dart';

Object mapToJsObject(Map map){
  var object = newObject();
  map.forEach((k, v) {
    if (v is Map) {
      setProperty(object, k, mapToJsObject(v));
    } else {
      setProperty(object, k, v);
    }
  });
  return object;
}

Map jsObjectToMap(dynamic jsObject) {
  Map result = {};
  List keys = _objectKeys(jsObject);
  for (dynamic key in keys) {
    dynamic value = getProperty(jsObject, key);
    List nestedKeys = objectKeys(value);
    if ((nestedKeys ?? []).isNotEmpty) {
      //nested property
      result[key] = jsObjectToMap(value);
    } else {
      result[key] = value;
    }
  }
  return result;
}

List<String> objectKeys(dynamic jsObject) {
  if (jsObject == null || jsObject is String || jsObject is num || jsObject is bool) return null;
  return _objectKeys(jsObject);
}

@JS('Object.keys')
external List<String> _objectKeys(jsObject);

关于dart - 将 Dart 2 Map 动态转换为 Javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51804476/

相关文章:

dart - js-interop:如何使用js-interop将javascript `new`实现为 Dart ?

javascript - SolanaWeb 3.js 包 TypeError : s. TransactionInstruction 不是构造函数

android - ModalBottomSheet中的tabBar具有动态大小的Flutter

flutter - 如何在控制台中获取图像的引用高度或宽度

flutter - Flutter和Dart将字符串转换为md5,然后作为字符串调用

google-chrome-extension - 在 dart 中构建 chrome 扩展时出现 chrome.runtime.onConnect 问题

javascript - 从 Dart 中的 JavaScript 对象获取任意属性

flutter - 匿名函数和回调...为什么不起作用?

dart - Flutter - 它在幕后是如何工作的?

dart - 使用 JavaScript 中的 Dart 类