Map

Posted Liu-h

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Map相关的知识,希望对你有一定的参考价值。

简介

Map -- JS内置对象

Map对象保存键值对 -- 能够记住键的原始插入顺序 -- 任何值(数据类型包括对象)都可以作为一个键或一个值

Map对象是键值对的集合 -- Map中的一个键只能出现一次

Map对象按键值对迭代 -- for...of循环在每次迭代后会返回一个形式为[key,value]的数组

let map = new Map([
    [1, \'liu\'],
    [2, \'hei\'],
    [3, \'may\']
]);
for (const item of map) 
    console.log(item);  // [1,\'liu\'] [2,\'hei\'] [3,\'may\']

Map可以在内部表示为复杂度小于O(N)的任何数据结构 -- 包括哈希表(O(1)查找)、搜索树(O(log(N))查找)

创建Map对象

语法

iterable -- Map对象的一个元素 -- 是键值对的数组或是其他可迭代对象

new Map() 	//	创建空对象
new Map(iterable) //创建带有元素的对象

创建新Map

const map = new Map([
[1,\'one\'],
[2,\'two\'],
[3,\'three\'],
]);
console.log(map);

实例属性

Map.prototype.size

size -- 只读属性 -- 不能修改 -- 值是一个整数 -- 表示Map对象有多少个键值对

const map = new Map([
[1,\'one\'],
[2,\'two\'],
[3,\'three\'],
]);
console.log(map.size);	//3

实例方法

Map.prototype.clear()

clear() -- 移除Map对象中的所有元素

const map = new Map([
    [1, \'one\'],
    [2, \'two\'],
    [3, \'three\'],
])
console.log(map.size);  //3
map.clear();
console.log(map.size);  //0

Map.prototype.delete()

delete() -- 移除Map对象中指定的元素

语法--delete(key)

key -- 要从Map中删除的元素的键

返回值 -- Map对象中的元素存在且已被移除 - 返回true;若元素不存在 - 返回false

const map = new Map([
    [1, \'one\'],
    [2, \'two\'],
    [3, \'three\'],
])
console.log(map.delete(1)); //true
console.log(map.delete(5)); //false
console.log(map);   //Map(2) 2 => \'two\', 3 => \'three\'

Map.prototype.get()

get() -- 从Map对象中返回指定的元素

若与该键相匹配的值是一个对象 -- 会获得对该对象的引用 -- 可用在Map对象中修改它

语法 -- get(key)

key -- Map对象返回的元素的键

返回值 -- 与该键相匹配的值 -- 若该键在Map对象中不存在 -- 返回undefined

const map = new Map([
    [1, \'one\'],
    [2, \'two\'],
    [3, \'three\'],
    [4, []]
])
console.log(map.get(1));    //one
console.log(map.get(10));   //undefined
map.get(4).push(\'four\')
console.log(map.get(4));       //[\'four\']

Map.prototype.has()

has() -- 返回一个布尔值 -- 判断具有指定键的元素是否存在

语法 -- has(key)

返回值 -- 若Map对象中存在具有指定键的元素 -- 返回true ;否则返回false

const map = new Map([
    [1, \'one\'],
    [2, \'two\'],
    [3, \'three\'],
    [4, []]
])
console.log(map.has(1));    //true
console.log(map.has(6));    //false

Map.prototype.set()

set() -- 为Map对象添加或更新一个指定键和值的新键值对

语法 -- set(key,value)

返回值Map对象

const map = new Map([
    [1, \'one\'],
    [2, \'two\'],
    [3, \'three\'],
    [4, []]
])
map.set(\'a\', \'A\');
map.set(4, \'four\')
console.log(map.set(\'b\', \'B\'));

链式使用set

map.set(\'c\', \'C\')
    .set(\'d\', \'D\')
    .set(\'e\', \'E\')
console.log(map);

Map.prototype.entries()

entries() -- 返回一个新的迭代器对象 -- 包含Map对象中按插入顺序排序的每个元素的键值对

迭代器对象也是一个可迭代对象 -- 可使用for-of循环

语法 -- entries

返回值 -- 一个新的Map迭代器对象

const map = new Map([
    [1, \'one\'],
    [2, \'two\'],
    [3, \'three\'],
    [4, []]
])
let iter = map.entries();
console.log(iter.next().value);
console.log(iter.next().value);
console.log(iter.next());

Map.prototype@@iterator

@@iterator -- 初始值与entries属性的初始值是同一个函数对象

语法 -- map[Symbol.iterator]

返回值 -- Map的iterator函数默认是entries()函数

let iter = map[Symbol.iterator]();
console.log(iter.next().value); //[1, \'one\']
console.log(iter.next().value); //[2, \'two\']
console.log(iter.next().value); //[3,\'three\']

在for...of中使用

for (const entry of map) 
    console.log(entry);

Map.prototype.keys()

keys() -- 返回一个引用的迭代器对象 -- 包括按顺序插入Map对象中每个元素的key值

语法 -- keys()

返回值 -- 一个新的迭代器对象

let iter = map.keys()
console.log(iter.next().value); //1
console.log(iter.next().value); //2
console.log(iter.next().value); //3

Map.prototype.values()

values() -- 返回一个新的的迭代器对象 -- 包括按顺序插入Map对象中每个元素的value值

语法 -- values()

返回值 -- 一个新的迭代器对象

let iter = map.values()
console.log(iter.next().value); //one
console.log(iter.next().value); //two
console.log(iter.next().value); //three

Map.prototype.forEach()

forEach() -- 安装插入顺序依次对Map中每个键值对执行一次给定的函数

语法

forEach(callbackFn)
forEach(callbackFn,thisArg)
  • callbackFn --Map中每个元素要执行的函数 -- 有如下参数 -- 都是可选
    • value -- 每个迭代的值
    • key -- 每个迭代的键
    • map -- 每个迭代的Map
  • thisArg -- 在callbackFn执行中使用的this的值

返回值undefined

  • 注意
    • forEach方法会对 map 中每个真实存在的键执行一次给定的 callbackFn函数。它不会对被删除的键执行函数。然而,它会对每个值为 undefined的键执行函数
    • 每个值只被访问一次,除非它在 forEach结束前被删除并被重新添加。callbackFn不会对在被访问前就删除的元素执行。在 forEach结束前被添加的元素都将会被访问
function logMapElements(value, key, map) 
    console.log(`map.get(\'$key\') = $value`);

new Map([
    [\'foo\', 3],
    [\'bar\', ],
    [\'baz\', undefined]
]).forEach(logMapElements)

Kotlin集合操作 ⑤ ( Map 集合 | 获取 Map 值 | Map 遍历 | 可变 Map 集合 )

文章目录





一、Map 集合



调用 mapOf 函数 创建 Map 集合 , 键值对 元素有两种初始化方式 :

  • 使用 to 函数进行初始化 : 在参数中使用 键 to 值 的方式进行初始化 ;
  • 使用 Pair 对象进行初始化 : 传入 Pair(键, 值) 进行初始化 ;

to 函数原型如下 , 其本质也是返回 Pair 类型的实例对象 ;

/**
 * 从this和[that]创建类型为[Pair]的元组。
 * 这对于创建噪音更少的[Map]字面量很有用,例如:
 * @sample samples.collections.Maps.Instantiation.mapFromPairs
 */
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

代码示例 :

fun main() 
    val map = mapOf("Tom" to 18, "Jerry" to 12, "Jack" to 20)
    println(map)

    val map2 = mapOf(Pair("Tom", 18), Pair("Jerry", 12), Pair("Jack", 20))
    println(map2)

执行结果 :

Tom=18, Jerry=12, Jack=20
Tom=18, Jerry=12, Jack=20




二、获取 Map 值



获取 Map 值 :

  • 使用 取值运算符 [] 获取 Map 集合中的值 , 运算符中传入 键 , 如果找不到 键 对应的 值 , 返回 null ;
  • 使用 Map#getValue 函数 , 获取 键 对应的 值 , 如果没有找到则抛出异常 ;
	public fun <K, V> Map<K, V>.getValue(key: K): V = getOrImplicitDefault(key)
  • 使用 Map#getOrElse 函数 , 获取 键 对应的 值 , 如果没有找到则返回 Lambda 表达式 参数 的返回值 ;
	public inline fun <K, V> Map<K, V>.getOrElse(
		key: K, 
		defaultValue: () -> V): V = get(key) ?: defaultValue()
  • 使用 Map#getOrDefault 函数 , 获取 键 对应的 值 , 如果没有找到则返回默认值 ;
    public fun getOrDefault(key: K, defaultValue: @UnsafeVariance V): V 
        // See default implementation in JDK sources
        throw NotImplementedError()
    

代码示例 :

fun main() 
    val map = mapOf("Tom" to 18, "Jerry" to 12, "Jack" to 20)
    println(map)

    val map2 = mapOf(Pair("Tom", 18), Pair("Jerry", 12), Pair("Jack", 20))
    println(map2)

    // 使用 取值运算符 `[]`  获取 Map 集合中的值 , 运算符中传入 键 , 如果找不到 键 对应的 值 , 返回 null
    println(map["Tom"])

    // 使用 Map#getValue 函数 , 获取 键 对应的 值 , 如果没有找到则抛出异常
    println(map.getValue("Tom"))

    // 使用 Map#getOrElse 函数 ,  获取 键 对应的 值 , 如果没有找到则返回 Lambda 表达式 参数 的返回值
    println(map.getOrElse("Tim", 20))

    // 使用 Map#getOrDefault 函数 , 获取 键 对应的 值 , 如果没有找到则返回默认值
    println(map.getOrDefault("Tim", 88))

执行结果 :

Tom=18, Jerry=12, Jack=20
Tom=18, Jerry=12, Jack=20
18
18
20
88




三、Map 遍历



Map 遍历方式 :

  • forEach 函数 , 传入 Lambda 表达式参数 , 该 Lambda 表达式的参数为 Map.Entry<K, V> 类型 ;
public inline fun <K, V> Map<out K, V>.forEach(action: (Map.Entry<K, V>) -> Unit): Unit 
    for (element in this) action(element)

  • forEach 函数 , 传入 Lambda 表达式参数 , 该 Lambda 表达式的 两个参数为 实际的 键值对 的类型 ;
    default void forEach(BiConsumer<? super K, ? super V> action) 
        Objects.requireNonNull(action);
        for (Map.Entry<K, V> entry : entrySet()) 
            K k;
            V v;
            try 
                k = entry.getKey();
                v = entry.getValue();
             catch(IllegalStateException ise) 
                // this usually means the entry is no longer in the map.
                throw new ConcurrentModificationException(ise);
            
            action.accept(k, v);
        
    

代码示例 :

fun main() 
    val map = mapOf("Tom" to 18, "Jerry" to 12, "Jack" to 20)
    println(map)

    map.forEach 
        // 可操作 Entry 对象
        println("$it.key = $it.value")
    

    map.forEach  key: String, value: Int ->
        // 可获取具体的键和值
        println("$key = $value")
    

执行结果 :

Tom=18, Jerry=12, Jack=20
Tom = 18
Jerry = 12
Jack = 20
Tom = 18
Jerry = 12
Jack = 20




四、可变 Map 集合



通过调用 mutableMapOf 函数 , 可创建 可变 Map 集合 ;

代码示例 :

fun main() 
    val mutableMap = mutableMapOf("Tom" to 18, "Jerry" to 12, "Jack" to 20)
    println(mutableMap)

    // 增加元素
    mutableMap += "Rose" to 18
    mutableMap.put("Tim", 21)
    println(mutableMap)

    // 查询是否有 某个键 对应的值, 如果没有则添加一个默认值进去
    mutableMap.getOrPut("Kate", 19 )
    println(mutableMap)

执行结果 :

Tom=18, Jerry=12, Jack=20
Tom=18, Jerry=12, Jack=20, Rose=18, Tim=21
Tom=18, Jerry=12, Jack=20, Rose=18, Tim=21, Kate=19

以上是关于Map的主要内容,如果未能解决你的问题,请参考以下文章

[]map[][]切片map小计

Kotlin集合操作 ⑤ ( Map 集合 | 获取 Map 值 | Map 遍历 | 可变 Map 集合 )

Kotlin集合操作 ⑤ ( Map 集合 | 获取 Map 值 | Map 遍历 | 可变 Map 集合 )

Map工具系列-08-map控件查看器

unordered map 和map的区别

Map.Entry遍历Map