var template = '/test/:key1/tester/:key2';
var filledIn = '/test/12/tester/3';
如何获得上面给定输入的像这样的地图?
[
key1: 12,
key2: 3
]
答案 0 :(得分:1)
以下方法可行,但这可能不是最优雅的解决方案。
使用 Map.from()
是因为List.asMap()
使用了不可修改的列表。
final template = '/test/:key1/tester/:key2';
final filledIn = '/test/12/tester/3';
final params = Map.from(template.split('/').asMap())
..removeWhere((i, part) => !part.startsWith(':'));
final values = Map.from(filledIn.split('/').asMap())
..removeWhere((i, part) => !params.containsKey(i));
print(params.values); // [:key1, :key2]
print(values.values); // [12, 3]
答案 1 :(得分:1)
这是一个更好的解决方案,可以提供您要求的确切格式。
void main() {
final template = Template('/test/:key1/tester/:key2');
print(template.parse('/test/12/tester/3')); // {key1: 12, key2: 3}
}
class Template {
Template(this.source);
final String source;
List<String> _parts;
Iterable<int> _params;
List<String> get parts => _parts ??= source.split('/');
Iterable<int> get params => _params ??= parts
.where((part) => part.startsWith(':'))
.map((param) => parts.indexOf(param));
Map<String, String> parse(String string) {
final p = string.split('/');
return Map.fromEntries(
params.map((index) => MapEntry(parts[index].substring(1), p[index])));
}
}