我在Dart中进行列表转换的时间很长。由于我的大部分经验是使用Typescript,因此我将在TS中提供一个可行的示例,然后在Dart中提供解决方案。
从响应到创建Coin对象都具有类型安全性的打字稿。
type Entry = {
spark: Record<string, Spark>;
};
type Spark = {
t: number;
p: number;
};
const coin = (entry: Entry): Coin => ({
sparkline: Object.values(entry.spark)
.sort((a, b) => a.t - b.t)
.map(spark => spark.p)
});
type Coin = {
sparkline: number[];
};
Dart具有脆弱的类型,令人困惑的字符串转换,并且无法告诉编译器此映射中的内容。
Coin.fromEntry(MapEntry<String, Map> e)
: this.sparkline = List<num>.from((List<Map>.from(e.value['spark'].values)
..sort((a, b) => a['t'].compareTo(b['t'])))
.map((spark) => spark['p'].toDouble())
.toList());
有没有一种方法可以对列表进行转换,这些转换对于从Coin对象的响应来说是安全的,并且易于阅读?
答案 0 :(得分:0)
这是翻译打字稿代码的另一种方法。
class Entry {
Map<String, Spark> spark;
}
class Spark {
int t;
double p;
}
class Coin {
List<double> sparkline;
Coin.fromEntry(Entry entry)
: sparkline = (entry.spark.values.toList()
..sort((a, b) => a.t.compareTo(b.t)))
.map((spark) => spark.p)
.toList() {}
}
如果Spark
作为JSON对象/字典进入您的程序,我建议创建一个单独的反序列化方法。这样,您无需在各处使用动态值,而可以在处理Spark值时利用类型系统。