如何获取 Map<int,dynamic> 中的最后 N 个元素?

Dan*_*ssa 4 dart

我目前有一个Map<int, dynamic>关键是插入顺序的地方。

例如

const Map<int, dynamic> log = {
  1: {'startDate': 1111, 'endDate': 2222},
  2: {'startDate': 123123, 'endDate': 1231233},
  3: {'startDate': 555555, 'endDate': 5555556},
  4: {'startDate': 888888},
};

Run Code Online (Sandbox Code Playgroud)

现在我怎样才能得到最后的X金额?

我在想

final Iterable<int> numberOfLogs = log.keys;
final Iterable<int> reversedNumberOfLogs = numberOfLogs.toList().reversed;
final Iterable<int> recent2Logs = reversedNumberOfLogs.take(2);
Run Code Online (Sandbox Code Playgroud)

然后我可以循环遍历recent2Logs然后log通过循环索引访问Map?

有一个更好的方法吗?

jam*_*lin 11

请注意,MapSet的默认实现分别是 aLinkedHashMapLinkedHashSet,它们在迭代它们时已经为您保留了插入顺序。利用这一点,要获取Iterable最后n个值,您可以执行以下操作:

var lastValues = log.values.toList().reversed.take(n);
Run Code Online (Sandbox Code Playgroud)

如果你希望结果保持Map带有整数键,那么那就是:

var prunedLog = Map.fromEntries(log.entries.toList().reversed.take(n));
Run Code Online (Sandbox Code Playgroud)

请注意,上面的两个示例都将按照从最近到最近的顺序返回项目。如果您想要按时间顺序排列它们,则必须再次反转结果,例如:

var prunedLog = Map.fromEntries(
  log.entries.toList().reversed.take(n).toList().reversed);
Run Code Online (Sandbox Code Playgroud)