flutter - 在地图值中插入地图键作为 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)
. 我做错了什么??有什么办法可以达到理想的效果吗??
解决方案
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
您不应该使用它。(“副作用”是回调所做的事情,而不仅仅是return
ing 一个值。)对于您关心副作用的回调,使用Iterable.forEach
或使用正常for
循环。
推荐阅读
- sockets - 有没有办法防止在单个 TCP 数据包中发送多个 SIP 消息?
- button - 需要 BigCommerce 后退按钮
- reactjs - 无法在我的反应项目中获取 .env 网址到我的组件
- c++ - 为什么 someNumber = rand() & 100 + 1; 不产生错误?
- multithreading - 在 x86 cpu 中窥探内存访问
- node.js - 流产生空缓冲区
- vpc - VPC 对等连接
- javascript - 根据 url 中的链接检查单选按钮
- erlang - 在erlang中调用list:keyfind()时出现错误记录
- php - 如何从php中的日期函数获取日、月和年?