在dart中,如何从模板和字符串中获取字段图?

时间:2018-10-11 22:20:54

标签: dart

var template = '/test/:key1/tester/:key2';
var filledIn = '/test/12/tester/3';

如何获得上面给定输入的像这样的地图?

[
  key1: 12,
  key2: 3
]

2 个答案:

答案 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])));
  }
}