首页 > 其他分享 >关于dart中Map的合并

关于dart中Map的合并

时间:2023-12-15 14:03:28浏览次数:47  
标签:Map recursive map 合并 dart key copyValues acceptNull

当想要合并两个map

Map<String, dynamic> a = {
  'a': 1,
  'c': {"c1": 1, "c2": 1},
};
Map<String, dynamic> b = {
  'b': 1,
  'c': {
    "c1": 2,
  },
};

可以这么写

Map<String, dynamic> c = {}..addAll(a)..addAll(b);

也可以用拓展运算符

Map<String, dynamic> c = {...a, ...b};

但是结果会有一些问题,深层次的属性会被直接覆盖掉

上边运算结果如下:

{a: 1, c: {c1: 2}, b: 1}


可能在某些场景并不符合你的预期,如期望以下结果,这时候我们用其他方法深度合并。

{a: 1, c: {c1: 2, c2: 1}, b: 1}

现成的类库如下(2323年12月14日):

belatuk_merge_map | Dart Package (pub.dev)

直接套用

import 'package:belatuk_merge_map/belatuk_merge_map.dart';
print(mergeMap([a, b]));


看下他的源码,很简单,就是递归检查,万变不离其宗。

Map<K, V> mergeMap<K, V>(Iterable<Map<K, V>> maps,
    {bool recursive = true, bool acceptNull = false}) {
  var result = <K, V>{};
  for (var map in maps) {
    _copyValues(map, result, recursive, acceptNull);
  }
  return result;
}
dynamic _copyValues<K, V>(
    Map<K, V> from, Map<K, V?> to, bool recursive, bool acceptNull) {
  for (var key in from.keys) {
    if (from[key] is Map<K, V> && recursive) {
      if (to[key] is! Map<K, V>) {
        to[key] = <K, V>{} as V;
      }
      _copyValues(from[key] as Map, to[key] as Map, recursive, acceptNull);
    } else {
      if (from[key] != null || acceptNull) {
        to[key] = from[key];
      }
    }
  }
}


ps: 插件有个小问题,

调用mergeMap<String,dynamic> ,但是子属性map会转化为<dynamic,dynamic>;

将上方法第16行修改为下边,更符合我的需求。

_copyValues(from[key] as Map<K,V>, to[key] as Map<K,V>, recursive, acceptNull);



标签:Map,recursive,map,合并,dart,key,copyValues,acceptNull
From: https://blog.51cto.com/u_16406280/8840530

相关文章

  • Feature map
    Featuremap(特征图)在CNN的每个卷积层,数据以三维形式存在。可以看成是多个二维图片叠在一起,其中每一个称为一个featuremap。在输入层,如果是灰度图片,那就只有一个featuremap;如果是彩色图片,一般是三个featuremap(红绿蓝)。在其他层,层与层之间会有若干个卷积核(kernel),也称为过滤器......
  • 在思岚A1上复现gmapping
    文章目录软硬件条件laser_scan_matcher通过源码安装rplidar_ros通过源码安装设置参数启动效果预览软硬件条件软件:Ubuntu20.04,ROSnoetic硬件:RPLidarA1.laser_scan_matcher通过源码安装mkdir-p~/catkin_ws/srccd~/catkin_ws/srcgitclonehttps://github.com/ccny-ros-pk......
  • java: MappedByteBuffer的用法
    packagenio;importjava.io.RandomAccessFile;importjava.nio.MappedByteBuffer;importjava.nio.channels.FileChannel;publicclassMappedByteBufferTest{publicstaticvoidmain(String[]args)throwsException{RandomAccessFilerandomAccessF......
  • SheetJS 合并后的单元格不能正常显示边框
    原配置样式代码/***设置单元格样式*@paramworksheet工作单元*@paramfirstRow开始行*@paramlastRow结束行*@paramfirstCol开始列*@paramlastCol结束列*@paramfont字号*@paramblod是否加粗*/setCellStyle(worksheet......
  • 倾斜摄影三维模型的根节点合并纹理匀色技术方法分析
    倾斜摄影三维模型的根节点合并纹理匀色技术方法分析 倾斜摄影三维模型的根节点合并中,纹理色彩匀色技术是一种重要的方法,旨在优化模型的纹理质量,使其在合并后呈现出更加均衡和自然的色彩。在本文中,我们将对纹理色彩匀色技术的方法进行详细分析。1、色彩均衡调整:色彩均衡调整......
  • SpringBoot+MyBatis-Plus没有扫描到Mapper的问题
    一、问题:WARN22052---[      main]ConfigServletWebServerApplicationContext: NoMyBatismapperwasfoundin'[xxx.xxx.xxxx]'package.Pleasecheckyourconfiguration.WARN22052---[      main]ConfigServletWebServerApplicationConte......
  • 【合并排序链表】分治/优先队列
    合并两个排序链表模拟维护一个合并链表,每次添加两个排序链表中较小val的节点即可模拟代码publicListNodemergeTwo(ListNodea,ListNodeb){if(a==null)returnb;if(b==null)returna;ListNodeans=newListNode(0);Lis......
  • 一、Mapster简介
    一、Mapster简介1、什么是Mapster(官方文档地址:https://github.com/MapsterMapper/Mapster)  Mapster是一个高性能的用于对象映射的类库,同类型的产品还有AutoMapper。它提供了一系列的API和工具,以下为几个重要的类和接口:@Adapt注解:用于将实体类映射到数据库表中的指定列上。@......
  • 把List变为map,并遇到重复值时自动过滤、并返回有序map
    Student:@Data@AllArgsConstructorpublicclassStudent{privateStringname;privateIntegerage;privateIntegerscore;}把list转成mapList<Student>students=List.of(newStudent(&q......
  • 三维模型的顶层合并构建的模型层级和块大小划分规则浅析
    三维模型的顶层合并构建的模型层级和块大小划分规则浅析   倾斜摄影超大场景的三维模型的顶层合并是一个复杂而庞大的任务,通常需要对模型进行层级和块大小的划分,以便更好地管理和处理数据。本文将对模型层级和块大小的划分规则进行浅谈。一、模型层级划分规则均匀划分:......