关于new Set( )还有哪些是你不知道的

news/2024/7/11 1:49:44 标签: 大数据, 前端, javascript, es6

 1、Set 特点:

  • Set   对象是值的集合, 可以按照插入的顺序迭代它的元素
  • Set   中的元素只会出现一次,即 Set 中的元素是唯一的,所以需要判断两个值是否相等
  • Set   中+0和 -0 是不同的值,可以使用 Object.is(+0,-0)进行判断返回false ,+0 严格相等于 -0
  • Set   对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用
  • Set 中NaN 和 undefined 都可以被存储在 Set 中,但是值得注意的是,尽管 NaN !== NaN,但是NaN之间在Set里却被视为相同的值(NaN 被认为是相同的,所以只能存一个)
javascript">const set1 = new Set('abc')//{'a','b','c'}

set1.add('abc')//{'a','b','c','abc'}

const set2 = new Set('aaa')//{'a'}

set2.add(undefined)//{'a',undefined}

const set3 = new Set(['abc'])//{'abc'}

set3.add(NaN)//{'abc',NaN}

2、Set 的实例属性:

size: 返回 Set 对象中的值的个数

javascript">const set1 = new Set('abc')
console.log(set1.size)// 3


const set2 = new Set('aaa')
console.log(set2.size)// 1

3、Set 的实例方法:

  1. add( value ): 在Set对象尾部添加一个元素, 返回该 Set 对象
  2. has(value): 判断Set对象中是否有一个元素,返回true/false
  3. clear( ): 移除Set对象内的所有元素
  4. delete( value ): 移除值为 value 的元素,并返回一个布尔值来表示是否移除成功         并且 has(value) 会在此之后返回 false
  5. entries(): 返回一个新的迭代器对象,该对象包含 Set 对象中的按插入顺序排列的所有元素的值的 [value, value] 数组。为了使这个方法和 Map 对象保持相似, 每个值的键和值相等
  6. forEach(( )=>{  }): 按照插入顺序,为 Set 对象中的每一个值调用一次 callBackFn
  7. keys( ):与 values() 方法相同,返回一个新的迭代器对象,该对象包含 Set 对象中的按插入顺序排列的所有元素的值
  8. values( ) : 返回一个新的迭代器对象,该对象包含 Set 对象中的按插入顺序排列的所有元素的值
javascript">let set = new Set();


set.add(1); // Set [ 1 ]
set.add(5); // Set [ 1, 5 ]
set.add(5); // Set [ 1, 5 ]//不变,因为已经存在一个值为 5 的成员了
set.add("abc"); // [ 1, 5, "abc" ]
const obj = {a: 1, b: 2};
set.add(obj);//

set.add({a: 1, b: 2}); // obj 指向的是不同的对象,所以可以添加进去

set.has(1); // true
set.has(3); // false
set.has(5);  // true
set.has(Math.sqrt(25));  //true Math.sqrt(25) 找25的平方根
set.has("Abc".toLowerCase()); // true  敏感区分大小写
set.has(obj); // true

set.size; // 5

set.delete(5);  // true,从 set 中移除 5
set.has(5);     // false, 5 已经被移除

set.size; // 4,刚刚移除一个值


for (let item of mySet){
    console.log(item) //按顺序输出 : 1, "abc", {"a": 1, "b": 2}, {"a": 1, "b": 2}
}


for (let item of mySet.keys()) {
    console.log(item) //按顺序输出 : 1, "abc", {"a": 1, "b": 2}, {"a": 1, "b": 2}
}


for (let item of mySet.values()) {
     console.log(item) //按顺序输出 : 1, "abc", {"a": 1, "b": 2}, {"a": 1, "b": 2}
}

//(key value 相等)
for (let [key, value] of mySet.entries()) {
     console.log(item) //按顺序输出 : 1, "abc", {"a": 1, "b": 2}, {"a": 1, "b": 2}
}

// 使用 Array.from 转换 Set 为 Array
var arr = Array.from(set); // [1, "abc", {"a": 1, "b": 2}, {"a": 1, "b": 2}]

// Set 和 Array 互换
set2 = new Set([1, 2, 3, 4]);
set2.size;// 4
[...set2];  // [1,2,3,4]

// 用 forEach 迭代
set.forEach(function(value) {
  console.log(value);// 依次输出 a,b,c
});

 4、应用:实现常见的基本集合

javascript">      const setA = new Set([1, 2, 3, 4]);
      const setB = new Set([2, 3]);
      const setC = new Set([3, 4, 5, 6]);
  • 子集

    javascript">      const isSuperset = (set1, set2) => {
            for (const item of set2) {
              if (!set1.has(item)) {
                return false;
              }
            }
            return true;
          };
          console.log('判断是否是子集', isSuperset(setA, setB));//true
  • 并集

    javascript">      const union = (set1, set2) => {
            const res = new Set(set1);
            for (const item of set2) {
              if (!set1.has(item)) {
                res.add(item);
              }
            }
            return res;
          };
          console.log('返回并集', union(setA, setC));// Set [1, 2, 3, 4, 5, 6]
  • 交集

    javascript">      const intersection = (set1, set2) => {
            const res = new Set();
            for (const item of set2) {
              if (set1.has(item)) {
                res.add(item);
              }
            }
            return res;
          };
          console.log('返回交集', intersection(setA, setC));// Set [3, 4]
  • 不同的成员组成一个新的集合

    javascript">      const symmetricDifference = (set1, set2) => {
            const res = new Set(set1);
            for (const item of set2) {
              if (res.has(item)) {
                res.delete(item);
              } else {
                res.add(item);
              }
            }
            return res;
          };
          console.log(
            '不同的成员组成一个新的集合',
            symmetricDifference(setA, setC)
          );// Set [1, 2, 5, 6]
  • A中剔除B的成员

    javascript">      const difference = (set1, set2) => {
            const res = new Set(set1);
            for (const item of set2) {
              res.delete(item);
            }
            return res;
          };
          console.log('A中剔除B的成员', difference(setA, setC));// Set [1, 2 ]


http://www.niftyadmin.cn/n/1409083.html

相关文章

微服务与SOA之间差了一个ESB

http://cloud.51cto.com/art/201512/500474.htm 微服务(micro services)这个概念不是新概念,很多公司已经在实践了,例如亚马逊、Google、FaceBook,Alibaba。微服务架构模式(Microservices Architecture Pattern)的目的是将大型的、复杂的、长…

ASP.NET Core 2 学习笔记(六)MVC

原文:ASP.NET Core 2 学习笔记(六)MVCASP.NET Core MVC跟ASP.NET MVC观念是一致的,使用上也没有什么太大的变化。之前的ASP.NET MVC把MVC及Web API的套件分开,但在ASP.NET Core中MVC及Web API用的套件是相同的。 本篇将介绍ASP.NE…

yii 获取当前域名_yii获取当前url和域名

//当前域名echo Yii::app()->request->hostInfo;//除域名外的URLecho Yii::app()->request->getUrl();//除域名外的首页地址echo Yii::app()->user->returnUrl;//除域名外的根目录地址echo Yii::app()->homeUrl;调用YII框架中 jquery:Yii::app…

一个5年运维工程师的新年回首

http://johnwang.blog.51cto.com/474770/755932/

Windows事件日志写入SQL Server并PowerBI统计分析

在这里我准备了2台系统,一个Windows Server 2012 R2的域控服务器DC01,一台SQL on CentOS7的SQL数据库服务器 首先我使用SQL Manager Studio连接到SQL数据库服务器创建需要存放Windows转发事件日志的数据库“EventCollections” CREATE DATABASE EventCol…

关于new Map( )还有哪些是你不知道的

1、Map 的特点 Map 对象保存键值对,并且能够记住键的原始插入顺序, 任何值都可以作为一个键或一个值Map 对象在迭代时会根据对象中的元素插入顺序来进行Map 对象使用 for ... of 循环在每次迭代后会返回一个形式为 [key, value] 的数组Map 对象键的比较基于零值相等的算法,在…

c# 获取cad文档的路径_C#获取当前路径的7种方法

C#获取当前路径的方法如下:1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName-获取模块的完整路径。2. System.Environment.CurrentDirectory-获取和设置当前目录(该进程从中启动的目录)的完全限定目录。3. System.IO.…

MySQL分片水很深

在与客户讨论分片决策的时候,我经常会先给他们讲下面这个真实的故事。几年前,有客户来找我,希望获得关于如何对系统分片的一些指导建议。他告诉我说,自从他知道很多应用MySQL的巨头(比如Facebook和Twitter)…