flutter - 如何将地图数据转换为自定义列表(嵌套、递归)?
问题描述
我想转换......
从:转换地图(字符串,动态)
到:条目(字符串标题,列出孩子)
地图对象:
Map<String, dynamic> mapData = {
"A": {
"B": {
"C":
{
"data1": "some data1",
"data2": "some data2",
"data3": "some data3",
"data4": "some data 4"
}
}
},
.......
};
]
data = generateRecursiveList(mapData);
// 我想要输出对象的数据
List<Entry> finalList = new List<Entry>();
List<Entry> generateRecursiveList(Map group){
var keylist = group.keys.toList();
var valueslist = group.values.toList();
for(int i=0; i<keylist.length;i++){
Entry entry = new Entry();
entry.title = keylist[i].toString();
List<Entry> childEntries = new List<Entry>();
for(int j=0; i<valueslist[j].length;j++){
if(valueslist[j] is Map){
childEntries.add(generateRecursiveList(valueslist[j])); // Recursive calling the same function to get the children
// I am not sure how i will get this children now
entry.children = childEntries;
}
}
// This is also I am not sure how to add the entries
finalEntries.add(entry);
}
}
输出对象:
final List<Entry> data = <Entry>[
Entry( 'A', <Entry>[
Entry( 'B',<Entry>[
Entry( 'C',<Entry>[
Entry( 'some data 1'),
Entry( 'some data 2'),
Entry( 'some data 3'),
Entry( 'some data 4')
])
])
]),
....
];
我试图编写一个递归函数,但无法将这些嵌套映射转换为列表。
解决方案
你可以这样做:
class Entry {
Entry({this.title, this.children});
String title;
List<Entry> children;
}
List<Entry> fromJson(Map<String, dynamic> json) {
final keys = json.keys.toList();
final res = List<Entry>();
for (final key in keys) {
final entry = Entry(title: key, children: fromJson(json[key]));
res.add(entry);
}
return res;
}
编辑:由于Dart 2.3,with for collections
,fromJson
也可以这样写:
List<Entry> fromJson(Map<String, dynamic> json) {
return [
for (final key in json.keys)
Entry(title: key, children: fromJson(json[key]))
];
}
推荐阅读
- typescript - 获取 d3 比例尺以根据连接数据动态更新?
- r - 将多个文本文件合并为一个 tsv 文件
- angular - 角度测试,socket.io “NullInjectorError:没有 WrappedSocket 的提供者”
- python - PyCharm 如何运行 Python 脚本?
- core-data - 如何将核心数据获取的结果作为目标视图的属性传递给 NavigationLink 目标而不返回 nil?
- html - `:is()` 不适用于伪元素
- php - 如何使用 Laravel Http 异步结果?
- r - 在使用函数时使用 R 对类似网站进行 Web 抓取
- web - 无法使用 Caddy ping 没有子域的域
- typescript - 如何表达高阶恒等函数