JS中Map对象的创建,遍历(7种)和使用(增删改查)

intro

JS中的Object类型实际上是一种键值对映射(key-value pairs)。
但是JS中这种键值对映射有点问题:key只能为string类型。
为了和其他编程语言有相似的数据结构(如Map, Dict等),ES6中新增了Map类型。

API

Map() 构造方法。
size 成员方法,返回map的大小。

  • CRUD
    set(key, value) - Map 新增键值对/修改值(可“链式调用”)。
    has(key) - boolean 是否含有键key
    get(key) 读取
    delete(key) 删除
    clear() 清空

  • 遍历相关
    map.keys() -Map Iterator 返回map的键迭代器。
    map.values() -Map Iterator 值迭代器。
    map.entries(o) -Map Iterator 键值对迭代器。

    map.forEach(callbackFn, ?thisArg) forEach()对容器中每个元素(键值对)执行callbackFn
    callbackFn函数声明:function(value, key) {...},注意参数顺序。

MapIterator

获取map对象的迭代器,有4种方式:
map.keys() 遍历map的keys。
map.values() 遍历values。
map.entries() 遍历map的键值对。
map[Symbl.iterator]()相当于map.entries(),也是对[key, value]进行遍历。

Map对象的7种遍历(1 + 2 * 3)

forEach()
for..of遍历keys, values, entries
iterator.next()遍历keys, values, entries

forEach()方法

map.forEach(function(value, key) {
  console.log(key, value);
})

for..of循环

keys = map.keys();
for (key of keys) {
  console.log(key);  // map.get(key)可得value值。
}

values = map.values();
for (value of values) {
  console.log(value);
}

entries = map.entries();
for ([key, value] of entries) {
  console.log(key, value);
}

利用Map Iterator对象的next()方法遍历(遍历次数为map.size)。

keys = map.keys();
for (i = 0; i < map.size; i++) {
  key = keys.next().value;       // obj.propertyName
  // key = keys.next()[value];   // obj[propertyName]
  console.log(key);
}

values = map.values();
for (i = 0; i < map.size; i++) {
  value = values.next().value;
  console.log(value);
}

entries = map.entries();
for (i = 0; i < map.size; i++) {
  entry = entries.next().value;
  console.log(entry[0], entry[1]);
}

NOTE

  • Map Iterator对象每次遍历下个元素都会调用next(),一次遍历完成之后,位置并不会复原。
    所以多次遍历必须用对应的map方法(keys, values(), entries())重新获取Map Iterator对象。
    若不重新获取,则迭代器无返回值,范围undefined

  • 关于entry
    entries = map.entries() 得到map对象的键值对迭代器。

entryObj = entries.next() entries.next()指向下一个键值对的对象。
entry = entryObj.value entryObj是一个对象 {value:[key, value],done:false}
key = entry[0] value属性的值实际上是一个长度为2的数组[key, value]
value = entry[1]

Map的使用和entry相关类型查看

map = new Map();  // 构造Map对象。
Map(0) {}
map.size  // 大小为0
0
map.set(1, "one").set(2, "two").set(3, "three");  // 增加键值对
Map(3) {1 => "one", 2 => "two", 3 => "three"}
map.size  // 大小为3
3
entries = map.entries();  // 获取键值对的`Map Iterator`对象
MapIterator {1 => "one", 2 => "two", 3 => "three"}
Object.prototype.toString.call(entries) // 类型为`MapIterator`。
"[object Map Iterator]"
entryObj = entries.next(); // 调用next(),返回一个entryObj,是个对象{value:数组, done:false}。
{value: Array(2), done: false}
Object.prototype.toString.call(entryObj)
"[object Object]"
entry = entryObj.value  // 对象的value属性是一个数组,长度为2。
(2) [1, "one"]
Object.prototype.toString.call(entry)
"[object Array]"
entry
(2) [1, "one"]
console.log(entry[0], entry[1])
VM7998:1 1 "one"

Map使用和entry相关类型查看

link

ES6新特性 Iterator

下面是一个简单的例程,演示了如何在C++中使用嵌套的map进行增删改查操作: ```c++ #include <iostream> #include <map> using namespace std; int main() { map<string, map<string, int>> student; // 学生名字 -> 科目 -> 分数 // 添加学生信息 student["Alice"]["Math"] = 90; student["Alice"]["English"] = 85; student["Bob"]["Math"] = 95; student["Bob"]["English"] = 92; // 输出学生信息 cout << "学生信息:" << endl; for (auto it = student.begin(); it != student.end(); it++) { cout << it->first << ":" << endl; for (auto it2 = it->second.begin(); it2 != it->second.end(); it2++) { cout << " " << it2->first << " " << it2->second << endl; } } // 查找学生信息 cout << "查找学生信息:" << endl; if (student.find("Alice") != student.end()) { cout << "Alice的信息:" << endl; for (auto it = student["Alice"].begin(); it != student["Alice"].end(); it++) { cout << " " << it->first << " " << it->second << endl; } } else { cout << "查无此人" << endl; } // 修改学生信息 cout << "修改学生信息:" << endl; if (student.find("Bob") != student.end()) { student["Bob"]["English"] = 90; cout << "Bob的信息修改成功:" << endl; for (auto it = student["Bob"].begin(); it != student["Bob"].end(); it++) { cout << " " << it->first << " " << it->second << endl; } } else { cout << "查无此人" << endl; } // 删除学生信息 cout << "删除学生信息:" << endl; if (student.find("Charlie") != student.end()) { student.erase("Charlie"); cout << "Charlie的信息删除成功" << endl; } else { cout << "查无此人" << endl; } return 0; } ``` 输出结果为: ``` 学生信息: Alice: English 85 Math 90 Bob: English 92 Math 95 查找学生信息: Alice的信息: English 85 Math 90 修改学生信息: Bob的信息修改成功: English 90 Math 95 删除学生信息: 查无此人 ``` 在这个例程中,我们首先定义了一个嵌套的map,表示学生的信息。然后,我们使用了一个嵌套的循环遍历这个map,并输出了所有学生的信息。 接着,我们使用find函数查找学生信息。如果查找到了学生信息,我们就使用一个循环遍历这个学生的科目分数,并输出结果。否则,就输出“查无此人”。 然后,我们使用一个嵌套的操作符[]修改了Bob的英语成绩,并使用一个循环遍历Bob的科目分数,并输出结果。 最后,我们使用erase函数删除了一个不存在的学生信息,然后输出“查无此人”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值