首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将Dart 2地图动态转换为Javascript对象

将Dart 2地图动态转换为Javascript对象
EN

Stack Overflow用户
提问于 2018-08-12 07:13:07
回答 2查看 814关注 0票数 2

我正在使用新的js包和dart 2sdk为chrome.storage.local.set编写一个自定义的dart到js interop。

Dart中的Map与JavaScript中的对象不是一回事,但每次开发人员想要使用面向公共的API时,强迫他们编写抽象类也不是正确的事情。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-12 09:45:43

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

代码语言:javascript
复制
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;
}
票数 5
EN

Stack Overflow用户

发布于 2020-04-26 15:27:36

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

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51804476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档