Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[es6] - Set数据结构 #14

Open
Jmingzi opened this issue Nov 22, 2017 · 0 comments
Open

[es6] - Set数据结构 #14

Jmingzi opened this issue Nov 22, 2017 · 0 comments

Comments

@Jmingzi
Copy link
Owner

Jmingzi commented Nov 22, 2017

其结构都以Iterator 对象知识为基础

Set 实例的属性和方法

  • Set.prototype.constructor:构造函数,默认就是Set函数。
  • Set.prototype.size:返回Set实例的成员总数。

操作方法

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

遍历操作

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员

可以解决的问题

  • 数组去重

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

image

从chrome的控制台我们可以看到实例自身的属性和方法。

// method 1
let set = new Set([1, 2, 3, 3, 3, 4])
console.log(Array.from(set)) // 1, 2, 3, 4

// method 2
[...new Set([1, 2, 3, 3, 3, 4])] // 1, 2, 3, 4

为什么Array.from可以接受set实例作为参数?我们来看看它的解释:

Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。

tips: 所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此,任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符(展开运算符)就无法转换。因为扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。对于还没有部署该方法的浏览器,可以用Array.prototype.slice方法替代。

image

  • 实现数组的并集(Union)、交集(Intersect)和差集(Difference)

let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])

// 并集
let union = new Set([...a, ...b])
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)))
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)))
// Set {1}
@Jmingzi Jmingzi changed the title Set数据结构 es6 - Set数据结构 Nov 22, 2017
@Jmingzi Jmingzi changed the title es6 - Set数据结构 [es6] - Set数据结构 Nov 22, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant