ES6的Set 数据结构

set 结构不会添加重复的值。

const s = new Set();
[2, 3, 3, 4, 5, 2, 6, 12, 5].forEach((item) => {
  s.add(item);
});
s.forEach((item) => {
  console.log(item);
});

Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。

const ss = new Set([12, 2, 3, 3, 4, 5, 2, 6, 12, 5]);
console.log([...ss]);
// 去除数组的重复成员
[...new Set(array)]

// 去除字符串里面的重复字符。
const ss = new Set("ad  m  inin");
console.log([...ss].join(""));
console.log(ss.size);

Set 内部判断两个值是否不同,类似于精确相等运算符(===);区别在于 Set 内部,两个NaN是相等

的。
const ss = new Set();
let a = NaN;
let b = NaN;
ss.add(a);
ss.add(b);
console.log(ss);
console.log(a === b);

两个对象总是不相等的。

let set = new Set();
set.add({});
console.log(set.size);
set.add({});
console.log(set.size); //2

// 判断是引用地址
let set = new Set();
const obj = { s: "s" };
set.add(obj);
set.add(obj);
console.log(set.size); //1

Set 结构的实例有以下属性。
Set.prototype.constructor
Set.prototype.size
操作方法(用于操作数据)
Set.prototype.add(value)
Set.prototype.delect(value)
Set.prototype.clear()
Set.prototype.has(value)

// 实操
const set = new Set();
set.add(1).add(2).add(3).add(2);
console.log(set.size); //3
console.log(set.has(1)); //true
console.log(set.has(2)); //true
set.delete(2);
console.log(set.has(2)); //false
set.clear();
console.log(set.size); //0

看看在判断是否包括一个键上面,Object结构和Set结构的写法不同。

const someName = "width";
const properties = {
  width: 1,
  height: 1,
};
if (properties[someName]) {
  console.log("obj进入");
}

const set = new Set();
set.add("width").add("height");
if (set.has(someName)) {
  console.log("set 进入");
}

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

const set = new Set([1, 2, 3, 4, 6, 4, 2]);
console.log(set);
const arr = Array.from(set);
console.log(arr);

// 去除数组重复成员
function dedupe(arr) {
  return Array.from(new Set(arr));
}
console.log(dedupe([1, 2, 3, 4, 6, 4, 2]));

遍历操作
Set 结构的实例有四个遍历方法,可以用于遍历成员。
Set.prototype.keys()
Set.prototype.values()
Set.prototype.entries()
Set.prototype.forEach()

// 因为 Set的结构,key === value,所以 keys()的结果和values()的结果一致;
const set = new Set(["red", "green", "blue"]);
for (const item of set.keys()) {
  console.log(item);
}
for (const item of set.values()) {
  console.log(item);
}
// entries方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。
for (const item of set.entries()) {
  console.log(item);
}
// Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法
for (const item of set) {
  console.log(item);
}
// forEach方法的参数就是一个处理函数。该函数的参数与数组的forEach一致
set.forEach((value, key) => {
  console.log(key, value);
});

应用

// 拓展运算符
let set = new Set(["red", "green", "blue"]);
let arr = [...set];
console.log(arr);
// 实现去重
let unique = [...new Set([1, 2, 3, 4, 4, 3, 2, 1])];
console.log(unique);
// 数组的map和filter方法也可以间接用于 Set 
let set = new Set([1, 2, 3]);
set = new Set([...set].map((x) => x * 2));
console.log(set);
let set1 = new Set([1, 2, 3, 4, 5]);
set1 = new Set([...set1].filter((x) => x % 2 == 0));
console.log(set1);
// 使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
let union = new Set([...a, ...b]);
console.log(union);
let intersect = new Set([...a].filter((x) => b.has(x)));
console.log(intersect);
let diff1 = new Set([...a].filter((x) => !b.has(x)));
let diff2 = new Set([...b].filter((x) => !a.has(x)));
console.log(diff1, diff2);
// 改变原来的Set结构
let set = new Set([1, 2, 3]);
set = new Set([...set].map((x) => x * 2));
set = new Set(Array.from(set, (x) => x * 2));
console.log(set);

你可能感兴趣的:(ES6的Set 数据结构)