js map 和set

39 篇文章 1 订阅

js map 和set

map

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键(ES6加入了Symbol作为属性名称)。这给它的使用带来了很大的限制。

它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
也就是说,
Object 结构提供了“字符串—值”的对应,
Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

//map的使用	
const map = new Map([
          ["a", 111],
          ["b", 222],
        ]);

        console.log(map.size);
        console.log(map.get("a"));
        map.set("c", 333);
        console.log(map.size);
        console.log(map.has("c"));
        console.log(map.delete("c"));
        console.log(map.size);
        map.clear();
        console.log(map.size)

//map的迭代
        console.log(map.keys());

        for (let key of map.keys()) {
          console.log(key);
        }

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

          console.log(key,value);
        }
//迭代器模式  for( of ) 迭代       for( in )  遍历对象

遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
keys():返回键名的遍历器。
values():返回键值的遍历器。
entries():返回所有成员的遍历器。
forEach():遍历 Map 的所有成员。

需要特别注意的是,Map 的遍历顺序就是插入顺序。

另外map中不存储重复的值。

    let obj = { a: 1 };

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

      //  obj就相当于作用域 this的指向
      //map 数组对象 直接的转换
      //前端是map数据对象 我要把数据传到后端

如果 Map 的键是一个基础类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,
比如0和-0就是一个键,布尔值true和字符串true则是两个不同的键。
另外,undefined和null也是两个不同的键。
虽然NaN不严格相等于自身,但 Map 将其视为同一个键。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-swHPbBzb-1597591566138)(C:\Users\dell\Desktop\我的前端博客\images2\map1.png)]

//map转数组 
const map = new Map([
        ["a", 111],
        ["b", 222],
      ]);
      //                         ...map ==  ["a", 111],["b", 222],    [] 或者 {}
      // ... 对象的一个扩展运算符 ,取出对象中所有可以遍历的属性,       拷贝到当前的对象
      console.log([...map]);

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

对象的数据解构扩展

ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。

代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。右侧是另一个例子。

function f(x,y){
    return {x,y};
}
//等价于
function f(x,y){
    return {x:x,y:y};
}

除了属性简写,方法也可以简写。

const f={
    method(){
        return "1";
        //等价于
        // method=function(){
        //return "1";
    }
}

注意,简洁写法的属性名总是字符串,这会导致一些看上去比较奇怪的结果。

JavaScript 定义对象的属性,有两种方法。

方法一是直接用标识符作为属性名
方法二是用表达式作为属性名,这时要将表达式放在方括号之内。
但是,如果使用字面量方式定义对象(使用大括号),在 ES5 中只能使用方法一(标识符)定义属性。

ES6 允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在方括号内。


对象可枚举

对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。
Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。

描述对象的enumerable属性,称为“可枚举性”,如果该属性为false,就表示某些操作会忽略当前属性。

目前,有四个操作会忽略enumerable为false的属性。

for…in循环:只遍历对象自身的和继承的可枚举的属性。
Object.keys():返回对象自身的所有可枚举的属性的键名。
JSON.stringify():只 串行化 对象自身的可枚举的属性。
Object.assign(): 忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。

ES6 一共有 5 种方法可以遍历对象的属性。

(1)for…in
for…in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)
(2)Object.keys(obj)
Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

set

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成 Set 数据结构。

set 允许你存储 任何类型的值 成员的值是唯一的 没有重复的值

 //set 用法
      let arr = [1, 2, 3, 4, 4];
      const set = new Set(arr);//左侧代码也展示了一种去除数组重复成员的方法。
//可以使用add()方法向 Set 结构加入成员
      set.add(5);
      console.log(set.size);
      console.log(set.has(5));
      console.log(set.delete(5));
      console.log(set.size);
	 [...new Set("aaadfac")].join();//adfc
	//左侧的方法也可以用于,去除字符串里面的重复字符。

向 Set 加入值的时候,不会发生类型转换,所以5和“5”是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身。

Set 结构的实例有以下属性。
Set.prototype.constructor:构造函数,默认就是Set函数。
Set.prototype.size:返回Set实例的成员总数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LsKirVhh-1597591566141)(C:\Users\dell\Desktop\我的前端博客\images2\set1.png)]

Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。

add(value):添加某个值,返回 Set 结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。

Array.from方法可以将 Set 结构转为数组

const a=new Set([1,2,3,4]);
cont array=Array.from(a);

Set数据结构的遍历操作

value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。

Array.from方法可以将 Set 结构转为数组

const a=new Set([1,2,3,4]);
cont array=Array.from(a);

Set数据结构的遍历操作

Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。这里需要注意,Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值