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

Dynamically convert a Dart 2 Map to a Javascript object

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

Dart 中的 Map 与 JavaScript 中的对象不同,而是迫使开发人员每次想使用 public面对API也是不对的。

所以,我正在寻找一种方法将 dart Map 转换为 JavaScript 对象,不需要编写摘要 class.

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

我通过编写将 Map 转换为 js 对象的函数解决了这个问题。

import 'package:js/js_util.dart' as js;
Object mapToJSObj(Map<dynamic,dynamic> a){
  var object = js.newObject();
  a.forEach((k, v) {
    var key = k;
    var value = v;
    js.setProperty(object, key, value);
  });
  return object;
}

已接受答案的略微修改版本,它还可以处理嵌套地图。我还添加了另一种转换方式的解决方案:从 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);