【问题标题】:Dynamically convert a Dart 2 Map to a Javascript object将 Dart 2 Map 动态转换为 Javascript 对象
【发布时间】:2019-01-19 03:07:15
【问题描述】:

我正在使用新的 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 对象的示例。

【问题讨论】:

    标签: dart dart-js-interop


    【解决方案1】:

    我可以通过编写这个将 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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-27
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2015-01-02
        相关资源
        最近更新 更多