首页 > 解决方案 > 在地图值中插入地图键作为 id

问题描述

我的目标是在地图值中插入一个地图键作为 id(这也是一个地图,嵌套的地图)。说我有一张地图如下

  Map<String, dynamic> userMap = {
    "id_1" : {
      "name": "John",
      "surname": "Doe",
      "age": 25,
    },
    "id_2" : {
      "name": "Jeremy",
      "surname": "Smith",
      "age": 42,
    }
  };

我想将其转换为

  Map<String, dynamic> userMap = {
    "id_1" : {
      "id": "id_1",
      "name": "John",
      "surname": "Doe",
      "age": 25,
    },
    "id_2" : {
      "id": "id_2",
      "name": "Jeremy",
      "surname": "Smith",
      "age": 42,
    }
  };

我试过这个

userMap.entries.map((entry) => (entry.value as Map).putIfAbsent('id', () => entry.key));

但它不工作。相反,它给出的结果为(id_1, id_2). 我做错了什么??有什么办法可以达到理想的效果吗??

标签: flutterdart

解决方案


userMap.entries.map((entry) => (entry.value as Map).putIfAbsent('id', () => entry.key));

这不起作用的原因是因为你没有对调用的结果做任何事情.map()。从Iterable.map文档

返回一个新的lazy Iterable...。只要返回Iterable的不是迭代,提供的函数f就不会被调用。

因此,您的回调函数永远不会被调用,也不会改变原始的Map. 您可以强制迭代.map()(eg userMap.entries.map(...).toList()) 的结果以获得您想要的结果。然而,这是浪费和误用Iterable.map

Iterable.map旨在用于对;执行功能转换 当回调有副作用时,Iterable您不应该使用它。(“副作用”是回调所做的事情,而不仅仅是returning 一个值。)对于您关心副作用的回调,使用Iterable.forEach或使用正常for循环。


推荐阅读