乐趣区

关于javascript:ES6-新特性之Set

ES6 提供了一个新的数据结构 Set,它和 Array 的构造很相似,然而 Set 中成员的值都是惟一的,没有反复的值。

创立 Set

Set 对象能够存储任何类型的惟一值,无论是原始值或者是对象援用。创立 Set 的实例须要用到 Set 构造函数,并且传入的参数必须只能是可迭代对象,例如数组,字符串

示例:

创立一个空的 set

let set1 = new Set(); 
console.log(set1);
// 输入: Set {}

创立并初始化一个 set

let set2 = new Set([1, 2, 3, 2, 1]);
console.log(set2);
// 输入: Set {1, 2, 3}

上述代码中,表名 Set 中的值必须是惟一的,不容许反复。

Set 的办法和属性

add()办法

add() 办法用于向 Set 中增加元素,返回一个新的 Set

示例:

例如咱们能够向 Set 中增加不同类型的值:

let set1 = new Set();
set1.add(1);
set1.add('xkd');

console.log(set1);
// 输入: Set {1, 'xkd'}

delete()办法

delete() 办法用于删除 Set 中的元素,返回一个布尔值,判断是否删除胜利。如果删除胜利返回 true,删除失败返回 false

示例:

删除 Set 中的指定元素:

let set1 = new Set([1, 2, 3, 4, 5]);

console.log(set1.delete(4));  // 输入:true
console.log(set1);  // 输入:Set {1, 2, 3, 5}

如果指定的元素在 Set 中不存在,则返回 false,示意删除失败:

console.log(set1.delete(10));  // 输入:false

has()办法

has() 办法用于判断某个值是否为 Set 的成员,返回一个布尔值。

示例:
let set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.has(2));  // 输入:true
console.log(set1.has(7));  // 输入:false

上述代码中,2set1 中的成员,所以返回 true,而 7 不是所以返回 false

clear()办法

clear() 办法用于清空 Set 中的全副成员。

示例:
let set1 = new Set([1, 2, 3, 4, 5]);
set1.clear();
console.log(set1);  // 输入:Set {}

size 属性

size 属性返回以后 Set 元素总数。

示例:
let set1 = new Set([1, 2, 3, 4, 5]);
console.log(set1.size);  // 输入:5

Set 遍历操作

Set 构造的实例有四个遍历办法,能够用于遍历 Set 中的成员。咱们一起来看一下。

keys()办法

keys() 办法是用于返回键名的遍历器。

示例:
let set_k = new Set(['xkd', 'Iven', 'summer']);
console.log(set_k.keys());
// 输入: [Set Iterator] {'xkd', 'Iven', 'summer'}

values()办法

values() 办法是用于返回键值的遍历器。

示例:
let set_v = new Set(['xkd', 'Iven', 'summer']);
console.log(set_v.values());
// 输入: [Set Iterator] {'xkd', 'Iven', 'summer'}

因为 Set 构造没有键名,只有键值,或者说键名和键值是同一个,所以 keys 办法和 values 办法的行为完全一致。

entries()办法

entries() 办法是用于返回键值对的遍历器。

示例:
let set_e = new Set(['xkd', 'Iven', 'summer']);
console.log(set_e.entries());

输入:

[Set Entries] {[ 'xkd', 'xkd'],
  ['Iven', 'Iven'],
  ['summer', 'summer']
}

forEach()办法

forEach() 办法应用回调函数遍历每个成员。

示例:
let set_f = new Set(['xkd', 'Iven', 'summer']);
set_f.forEach(function(value,key){console.log(value+":"+key);
})

输入:

xkd:xkd
Iven:Iven
summer:summer

forEach 办法的参数就是一个回调函数,该函数的参数与数组的 forEach 统一,顺次为键值、键名、汇合自身。这里须要留神,Set 构造的键名就是键值因而第一个参数与第二个参数的值永远都是一样的。

forEach 办法还能够有第二个参数,示意绑定处理函数外部的 this 对象。

Set 对象的作用

  • 去重
let set1 = new Set([1, 2, 3, 4, 2, 4]);
console.log(set1);  // Set {1, 2, 3, 4}
  • 并集
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
var union = new Set([...set1, ...set2]); 
console.log(union);  // 输入:Set {1, 2, 3, 7, 6}
  • 交加
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
let inter = new Set([...set1].filter(x=>set2.has(x))) //{4,5}
console.log(inter);  // 输入:Set {1}
  • 差集
var set1 = new Set([1, 2, 3]);
var set2 = new Set([7, 6, 1]);
var diff = new Set([...set1].filter(x => !set2.has(x))); // {1}
console.log(diff);  // 输入:Set {2, 3}

Set 类型转换

Set 类型的值能够和其余数据类型的值进行类型转换,咱们来看一下。

  • Array 转为 Set
let arr1 = ["x", "k", "d"];
let set1 = new Set(arr1);
console.log(set1);  // 输入:Set {'x', 'k', 'd'}
  • Set 转为 Array:能够通过扩大运算符 ... 来实现。
let set1 = new Set(["x", "k", "d"]);
var arr1 = [...set1];
console.log(arr1);    // 输入:['x', 'k', 'd']
  • String 转为 Set
let set1 = new Set('xkd');
console.log(set1);    // 输入:Set {'x', 'k', 'd'}

留神 Set 中的 toString 办法是不能将 Set 转换成 String 类型的。

退出移动版