您将如何将 Map 转换为 dart 的对象
How would you translate a Map to and object for dart
假设我想重构我的代码以便更容易阅读,并且我有一个类型为 Map 的对象 属性 什么是转换此 属性 到另一个对象?当它是地图时,我可以使用它的 String 键调用相关对象。如果它成为另一个对象,我将如何调用我想要的对象?
例如:
class A1{
Map<String,B1> property;
}
to:
class A1{
List<B2> property;
}
class B2{
String key;
B1 property;
}
在上面的示例中,为了获得 属性 我想要的,我必须过滤 key = keyIwant 的列表,而如果它是一个地图,我可以调用 map[key]。有什么有效的方法可以将地图转换为对象吗? Dart是我用的技术
我想您正试图通过将当前的 Map
替换为其他内容来使您的代码更易于维护,您将其称为 object
.
我还假设 object
是指带有类型化字段的 Dart 类。
如果您希望继续能够通过字符串名称查找“对象”,则无法避免使用 Map
。
如果“键”在 compile-time(即在您的程序实际运行之前)都是已知的,那么您可以使用类型化对象,这是您应该更喜欢的,因为它使推理和组织代码变得更加容易.
假设您知道您的地图将永远只有键 a
和 b
,类型分别为 A
和 B
。然后你就可以轻松更换你的地图了:
class A {}
class B {}
class MyClass {
final A a;
final B b;
MyClass(this.a, this.b);
}
简单。
如果某些“键”可能不存在,只需将它们转换为可为空的值即可:
class A {}
class B {}
class MyClass {
final A? a;
final B? b;
// passing a or b is now optional!
MyClass({this.a, this.b});
}
如果您根本不知道按键是什么,那么就没有办法使用 Map
。这就是他们的目的。
虽然 Dart 支持动态类型,但您可以“假设”某些键将具有某些类型。因此,虽然这通常不利于代码维护,因为无法在程序运行之前对其进行分析(即它可能会在运行时崩溃),但您可以这样做:
class Foo {
final String a;
Foo(this.a);
String toString() => 'Foo($a)';
}
class Bar {
final String a;
Bar(this.a);
String toString() => 'Bar($a)';
}
// example usage
void main() {
Map<String, dynamic> map = {'foo': Foo('a foo')};
Foo foo = map['foo'];
print(foo); // ok!
Bar? bar = map['bar'];
print(bar); // null
}
希望这有助于阐明何时应使用“对象”以及何时需要使用地图。
假设我想重构我的代码以便更容易阅读,并且我有一个类型为 Map
例如:
class A1{
Map<String,B1> property;
}
to:
class A1{
List<B2> property;
}
class B2{
String key;
B1 property;
}
在上面的示例中,为了获得 属性 我想要的,我必须过滤 key = keyIwant 的列表,而如果它是一个地图,我可以调用 map[key]。有什么有效的方法可以将地图转换为对象吗? Dart是我用的技术
我想您正试图通过将当前的 Map
替换为其他内容来使您的代码更易于维护,您将其称为 object
.
我还假设 object
是指带有类型化字段的 Dart 类。
如果您希望继续能够通过字符串名称查找“对象”,则无法避免使用 Map
。
如果“键”在 compile-time(即在您的程序实际运行之前)都是已知的,那么您可以使用类型化对象,这是您应该更喜欢的,因为它使推理和组织代码变得更加容易.
假设您知道您的地图将永远只有键 a
和 b
,类型分别为 A
和 B
。然后你就可以轻松更换你的地图了:
class A {}
class B {}
class MyClass {
final A a;
final B b;
MyClass(this.a, this.b);
}
简单。
如果某些“键”可能不存在,只需将它们转换为可为空的值即可:
class A {}
class B {}
class MyClass {
final A? a;
final B? b;
// passing a or b is now optional!
MyClass({this.a, this.b});
}
如果您根本不知道按键是什么,那么就没有办法使用 Map
。这就是他们的目的。
虽然 Dart 支持动态类型,但您可以“假设”某些键将具有某些类型。因此,虽然这通常不利于代码维护,因为无法在程序运行之前对其进行分析(即它可能会在运行时崩溃),但您可以这样做:
class Foo {
final String a;
Foo(this.a);
String toString() => 'Foo($a)';
}
class Bar {
final String a;
Bar(this.a);
String toString() => 'Bar($a)';
}
// example usage
void main() {
Map<String, dynamic> map = {'foo': Foo('a foo')};
Foo foo = map['foo'];
print(foo); // ok!
Bar? bar = map['bar'];
print(bar); // null
}
希望这有助于阐明何时应使用“对象”以及何时需要使用地图。