js语法---map,set结构

        map和set是像对象和数组一样的数据结构集,内部可以按照一定的关系存放一串数据

map

        map是一个带键的数据项的集合,就像一个 Object 一样。 但是它们最大的差别是 Map 允许任何类型的键(key)。

它的方法和属性如下:

  • new Map() —— 创建 map。
  • map.set(key, value) —— 根据键存储值。
  • map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined
  • map.has(key) —— 如果 key 存在则返回 true,否则返回 false
  • map.delete(key) —— 删除指定键的值。
  • map.clear() —— 清空 map。
  • map.size —— 返回当前元素个数。

创建map

// 创建map对象
let m = new Map();

m.set("name1","Tom");
m.set("name2","Jerry");
m.set("name3","shy");

console.log(m);

        可以看到map像对象(object)一样key/value存放了数据,但是map保存了顺序(0,1,2)

m.set(1,"number").set(true,"boolean").set({type:"object"},"object");

 

        set()方法存放数据会返回给原来的map,所以我们可以链式的调用set方法;同时在map中键并不一定得是字符串类型,像数字和布尔类型,对象在map中并没有被转换而是被保留了下来,使用对象作为键是 Map 最值得注意和重要的功能之一。

遍历map

如果要在 map 里使用循环,可以使用以下三个方法:

  • map.keys() —— 遍历并返回一个包含所有键的可迭代对象,
  • map.values() —— 遍历并返回一个包含所有值的可迭代对象,
  • map.entries() —— 遍历并返回一个包含所有实体 [key, value] 的可迭代对象,for..of 在默认情况下使用的就是这个(map与 map.entries() 相同)。
// 遍历map
console.log("遍历所有的键-------------");
// 遍历所有的键
for (let key of map.keys()) {
    console.log(key);
}
console.log("遍历所有的值-------------");
// 遍历所有的值
for (let value of map.values()) {
    console.log(value);
}
console.log("遍历所有的实体-------------");
// 遍历所有的实体 [key, value]
for (let entry of map) { // 与 map.entries() 相同
    console.log(entry);
}
// 对每个键值对 (key, value) 运行 forEach 函数
map.forEach( (key,value) => {
    console.log(`${key}: ${value}`);
});

        map可以在new Map()的时候插入值---->当创建一个 Map 后,我们可以传入一个带有键值对的数组(或其它可迭代对象)来进行初始化,而迭代的顺序与插入值的顺序相同,即前面保存数据的时候保留的顺序。

map和对象

Object.entries:从对象创建 Map

let obj = {
    name : "Tom",
    age : 18
}
// Object.entries将对象转成键值对数组
let newMap = new Map(Object.entries(obj));
console.log(newMap);

 

        Object.entries将对象转成键值对数组,在构造成map

Object.fromEntries:从 Map 创建对象

// 创建map对象
let map = new Map([
    ["key1",10],
    ["key2",20],
    ["key3",30]
]);
// Object.fromEntries将map转成对象
let newObj = Object.fromEntries(map);
console.log(newObj);

         Object.fromEntries将map转成对象,这里要注意对象中的键只能是字符,不能为其他类型数据(number,Boolean)

set

Set 是一个特殊的类型集合 —— “值的集合”(没有键),它的每一个值只能出现一次 ,这表示set不能有重复元素。

它的主要方法如下:

  • new Set(iterable) —— 创建一个 set,如果提供了一个 iterable 对象(通常是数组),将会从数组里面复制值到 set 中。
  • set.add(value) —— 添加一个值,返回 set 本身
  • set.delete(value) —— 删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false
  • set.has(value) —— 如果 value 在 set 中,返回 true,否则返回 false
  • set.clear() —— 清空 set。
  • set.size —— 返回元素个数。

set像map的简化(只有值的map),继承的方法和map类似

创建set

// 创建一个set
let s = new Set([10,20]);
let obj = {
    name : "Tom",
    age : 18
}
s.add(obj).add("这是一个set");

console.log(s);

 遍历set

Map 中用于迭代的方法在 Set 中也同样支持:

  • set.keys() —— 遍历并返回一个包含所有值的可迭代对象,
  • set.values() —— 与 set.keys() 作用相同,这是为了兼容 Map
  • set.entries() —— 遍历并返回一个包含所有的实体 [value, value] 的可迭代对象,它的存在也是为了兼容 Map
console.log("遍历set-------------");
// 遍历set
for (let value of s) console.log(value);
console.log("foreach-------------");
// foreach方法
s.forEach((value, valueAgain,set)=>{
    console.log(value,"===",valueAgain);
})

        set使用foreach方法时要注意,内部函数的参数value, valueAgain是一致的,相当于key等于value(set中不能有重复元素),

总结

Map —— 是一个带键的数据项的集合。

方法和属性如下:

  • new Map([iterable]) —— 创建 map,可选择带有 [key,value] 对的 iterable(例如数组)来进行初始化。
  • map.set(key, value) —— 根据键存储值,返回 map 自身。
  • map.get(key) —— 根据键来返回值,如果 map 中不存在对应的 key,则返回 undefined
  • map.has(key) —— 如果 key 存在则返回 true,否则返回 false
  • map.delete(key) —— 删除指定键对应的值,如果在调用时 key 存在,则返回 true,否则返回 false
  • map.clear() —— 清空 map 。
  • map.size —— 返回当前元素个数。

与普通对象 Object 的不同点:

  • 任何键、对象都可以作为键。
  • 有其他的便捷方法,如 size 属性。

Set —— 是一组唯一值的集合。

方法和属性:

  • new Set([iterable]) —— 创建 set,可选择带有 iterable(例如数组)来进行初始化。
  • set.add(value) —— 添加一个值(如果 value 存在则不做任何修改),返回 set 本身。
  • set.delete(value) —— 删除值,如果 value 在这个方法调用的时候存在则返回 true ,否则返回 false
  • set.has(value) —— 如果 value 在 set 中,返回 true,否则返回 false
  • set.clear() —— 清空 set。
  • set.size —— 元素的个数。

        在 Map 和 Set 中迭代总是按照值插入的顺序进行的,所以我们不能说这些集合是无序的,但是我们不能对元素进行重新排序,也不能直接按其编号来获取元素。

完整代码和运行结果

// 创建map对象
let m = new Map();

// 传值
m.set("name1","Tom");
m.set("name2","Jerry");
m.set("name3","shy");
m.set(1,"number").set(true,"boolean").set({type:"object"},"object");

console.log(m);

// 创建map对象
let map = new Map([
    ["key1",10],
    ["key2",20],
    ["key3",30]
]);
// 遍历map
console.log("遍历所有的键-------------");
// 遍历所有的键
for (let key of map.keys()) {
    console.log(key);
}
console.log("遍历所有的值-------------");
// 遍历所有的值
for (let value of map.values()) {
    console.log(value);
}
console.log("遍历所有的实体-------------");
// 遍历所有的实体 [key, value]
for (let entry of map) { // 与 map.entries() 相同
    console.log(entry);
}
console.log("foreach-------------");
// 对每个键值对 (key, value) 运行 forEach 函数
map.forEach( (key,value,map) => {
    console.log(`${key}: ${value}`);
});

let obj = {
    name : "Tom",
    age : 18
}
// Object.entries将对象转成键值对数组
let newMap = new Map(Object.entries(obj));
console.log(newMap);
// Object.fromEntries将map转成对象
let newObj = Object.fromEntries(map);
console.log(newObj);

// 创建一个set
let s = new Set([10,20]);
s.add(obj).add("这是一个set");

console.log(s);

console.log("遍历set-------------");
// 遍历set
for (let value of s) console.log(value);
console.log("foreach-------------");
// foreach方法
s.forEach((value, valueAgain,set)=>{
    console.log(value,"===",valueAgain);
})

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值