ES6 Set 数据类型

定义:Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

语法

new Set([iterable]);

参数
iterable
如果传递一个可迭代对象,它的所有元素将不重复地被添加到新的 Set中。如果不指定此参数或其值为null,则新的 Set为空。
返回值
一个新的Set对象。

set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。

{
  let list = new Set();
  list.add(5);
  list.add(7);

  //获取list的元素数量 
  //size类似数组的length
  console.log('size',list.size); //size 2
  console.log('set-list',list); //{5, 7}
}

{
  let arr = [1,2,3,4,5];
  let list = new Set(arr);
  console.log('size',list.size); //size 5
  console.log('set-list',list); //{1, 2, 3, 4, 5}
}

{
  let obj = {a:2,b:3};
  let list = new Set();
  list.add(obj);
  obj['a'] = 4; //修改
  console.log('set-list-obj',list); //{{[{a:4,b:3}]}}
  
}

{
  let list = new Set();
  list.add(1);
  list.add(2);
  list.add(1); //set添加重复元素不会报错,但不生效 ——应用:数组去重

  console.log('list',list); //{1, 2}

  let arr = [1,2,3,1,2,4];
  let list2 = new Set(arr);

  //将数组重复的元素过滤!
  console.log('unique',list2); //{1, 2, 3, 4}

  //set不做数据类型转换,2和'2'数据类型不一样
  let arr1 = [1,2,3,1,'2',4];
  let list3 = new Set(arr1);
  console.log('unique',list3); //{1, 2, 3,'2', 4}
}

set实例的方法

//set实例的方法
{
  let arr = ['add','delete','clear','has'];
  let list = new Set(arr);

  //has 判断set中有没有指定的元素
  console.log('has',list.has('add')); //true

  //delete 删除指定的元素
  console.log('delete',list.delete('add'),list); //true  {"delete", "clear", "has"}

  //clear 清空整个set
  list.clear();
  console.log('list',list); // {}
}

set 遍历
set是一组key的集合 但不存储vaule,遍历处理的key和value是一样的 在Set中,没有重复的key。

//set 遍历 set是一组key的集合 但不存储vaule,遍历处理的key和value是一样的 在Set中,没有重复的key。
{
  let arr = ['add','delete','clear','has',{last:2}];
  let list = new Set(arr);
  console.log('set-list',list); //{"add", "delete", "clear", "has", {…}}
  for(let key of list.keys()){
    console.log('keys',key); //value add, value delete, value clear, value has, keys {last: 2}
  }

  for(let value of list.values()){
    console.log('value',value); //value add, value delete, value clear, value has, value {last: 2}
  }

  for(let [key,value] of list.entries()){
    //这里可以看出set中的key和value是一样的
    console.log('entries',key,value); //entries add add,  entries delete delete, entries clear clear, entries has has, entries {last: 2} {last: 2}
  }

  list.forEach(function(item){
    console.log(item); //add delete clear has {last: 2}
  })
}

set应用

  1. 数组去重
//数组去重
{
  let arr = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5];
  let list = new Set(arr);
  console.log(list); //{2, 3, 4, 5, 6, 7, 32}
}

{
  console.log(new Set([2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5])); //{2, 3, 4, 5, 6, 7, 32}
}
//转化为Array
{
  const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5];
  console.log([...new Set(numbers)]); //[2, 3, 4, 5, 6, 7, 32]
}
  1. 交集 并集 差集
//intersect可以通过
{
  let set1 = new Set([1,2,3,4,5,6,7,8]);
  let set2 = new Set(['a','b','c',1,2,3,4]);
  var intersection = new Set([...set1].filter(x => set2.has(x)));
  //使用[...]扩展运算符将对象转化为数组
  var intersectionArray = [...new Set([...set1].filter(x => set2.has(x)))];
  
  // difference不通过
  var difference = new Set([...set1].filter(x => !set2.has(x)));
   //使用[...]扩展运算符将对象转化为数组
  var differenceArray = [...new Set([...set1].filter(x => !set2.has(x)))];

  console.log('交集',intersection); //{1, 2, 3, 4}
  console.log('交集-数组形式',intersectionArray); //[1, 2, 3, 4]
  console.log('差集',difference); //{5, 6, 7, 8}
  console.log('差集-数组形式',differenceArray); //[5, 6, 7, 8]
}

{
    var a = new Set([1, 2, 3]);
    var b = new Set([4, 3, 2]);
    var union = new Set([...a, ...b]); // {1, 2, 3, 4} 并集
}
  1. Array相关
{
  var myArray = ["value1", "value2", "value3"];
  // 用Set构造器将Array转换为Set
  var mySet = new Set(myArray);
  console.log(mySet.has("value1")); // returns true

  // 用...(展开操作符)操作符将Set转换为Array
  console.log([...mySet]); // 与myArray完全一致
}
  1. String相关
{
  var text = 'Indiana';
  var mySet = new Set(text);  // Set {'I', 'n', 'd', 'i', 'a'}
  console.log(mySet.size);  // 5
}

WeakSet对象与Set对象的区别

//WeakSet对象与Set对象的区别
//1. weakset的数据类型只支持对象,weakset的对象是弱引用
//2. set的一些属性和方法weakset是没有的
{
  let weakList = new WeakSet();

  let arg = {a:'1',b:'2'};
  weakList.add(arg); //weakset的数据类型只支持对象!!
  // WeakSet.clear(); 报错 没有该方法
  // weakList.add(2); //报错
  //weakset不支持 clear()方法 没有 sizes属性 不能遍历!!

  console.log('weakList',weakList); //weakList WeakSet {Object {}}
}

猜你喜欢

转载自blog.csdn.net/weixin_43931898/article/details/102846425