前端学习Dart|第五节

前言

本章节主要讲解知识点:Map对象、dart:convert、MapEntry、Javascript Map、自平衡二叉树

视频地址:传送门

Map

Map对象是一个简单的键/值对,Map是动态集合。换句话说,Maps可以在运行时增长和缩小。

可以通过两种方式声明Map

  • 使用Map构造函数
  • 使用Map字面量

构造器声明

Map对象可以使用构造器如下声明

image.png

字面量声明

Map对象使用字面量声明如下:

image.png

修改操作

构造函数初始化方式:

image.png

上述两种声明方式都可以以如下方法初始化Map对象

image.png

在Map键值对中,其中的“键”,也就是K,可以为任意类型(这里可以称为对象,因为所有类型都是对象),包括null。

image.png

如上赋值了两个类型的key, Map对象类型、null。都是可以的。

这里可能需要提前了解一下var,还记得在最开始章节讲var的时候使用var声明变量,在Dart编译过程中会进行类型推断,在Map类型中也是这样的。但是有一点点不同,因为Map对象有两种类型:key,value

看一下这个例子:

image.png

Dart 会将 a 的类型推断为 Map<String, String>, 如果尝试在上面的 map 中添加错误类型,那么分析器或者运行时会引发错误。其余的知识点将在泛型章节讲解。提前预知一下。

常用属性及方法

Map.from()

克隆一个 Map,通过 Map.from() 仅仅能够实现浅克隆。

image.png

对于深克隆,我们可以简单的这样去处理:

image.png

dart: convert

解码(JSON String->Object)

image.png

编码(Object->JSON String): 支持int, double, String, bool, null, List, Map (with string keys)

image.png

解码(UTF-8)

image.png

编码(UTF-8)

image.png

fromIterable()

从Iterable类型生成Map对象

image.png

fromIterables()

从两个Iterable类型生成Map对象,一个为key参照,一个为value参照。两个Iterable类型长度必须一致。

image.png

keys

获取所有的keys,根据上一节课讲解的List对象理论来讲,这里返回的keys也是Iterable类型,并不是直接返回List对象类型。

image.png

values

获取所有的values,返回Iterable类型

image.png

isEmpty

判断Map对象是否为空

remove()

删除指定key的数据

image.png

addAll()

合并指定Map对象

image.png

containsValue()

判断在Map对象中是否有指定的值,返回bool类型

image.png

containsKey()

判断在Map对象中是否有指定的key,返回bool类型

image.png

length

返回在map中键值对的数量

image.png

forEach()

循环map中的键值对,内部函数参数分别为key、value,函数为void 无返回值

forEach循环中不可以删除或修改key的值

image.png

updateAll()

根据函数规则更新所有的

image.png

map

语法:

image.png

map() 遍历每个键值对 根据参数函数,对key、value做出修改,转换成其他Map。转换的Map可以是其他类型。

MapEntry

创建一条键值对,也可以说为一条键值对的表示。我们先确定一下概念,Map对象是键值对的集合,是个集合。MapEntry表示一条键值对。

image.png

当然MapEntry有自己的属性及方法:key、value等.

多个MapEntry即为entries。看一下语法

image.png

可知entries为Iterable类型。单个MapEntry意义不大,多个必须为Iterable类型。这样的话方便迭代。

fromEntries()

也可以通过多个MapEntry生成Map对象

image.png

为什么Iterable类型转换成Map类型后,同样的forEach难道都是Iterable 的forEach?

是的,只不过迭代顺序概念上有些区别

List:迭代按照索引顺序。

Map:

  • 普通的hashMap是无序的
  • LinkedHashMap迭代顺序为key插入的顺序
  • SplayTreeMap 自平衡二叉树中的 – 伸展树?

Map对象的迭代顺序属于第二种。

自平衡二叉树

这个东西没有百度百科讲的好,直接看视频:传送门

那么Dart中的SplayTreeMap是什么样的呢:

对于经常存储和访问的数据(如缓存),SplayTreeMap是一个不错的选择。 原因是他们使用树旋转将一个元素调到根,以便更频繁地访问。 性能来自树的自我优化。 也就是说,频繁访问的元素移动到更靠近顶部。 但是,如果同时经常访问树,那么使用SplayTreeMap几乎没有意义。

举个例子,调制解调器路由器以非常高的速率接收网络数据包。 调制解调器必须决定哪个数据包进入哪个线路。 这可以使用map实现,其中键是IP,值是目标线路。 对于这种情况,SplayTreeMap是一个不错的选择,因为大多数IP地址将被多次使用,因此可以从树的根目录找到它们。

javascript Map

Object

Properties are identified using key values

javascript中的Object本质上解为键值对的集合,

键的话只可以为字符串或者Symbol值。Symbol类型的key在上一节课的时候讲到了一个Symbol.iterator。

image.png

这本身会有很大的限制。所以为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

Map

javascript中的Map大家都比较了解,这里讲解一点。

Map.keys在javascript中返回的依然是迭代协议。上面Dart Map对象中的keys返回为Iterable类型,这里与Iterable章节内容相呼应。

image.png

javascript中Map的遍历顺序就是插入顺序。

END

本章节主要讲解知识点:Map对象、dart:convert、MapEntry、Javascript Map、自平衡二叉树。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享