1.Set()
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。类似于python中的元组。
2.forEach()方法
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
function(currentValue, index, arr)
3.slice()方法
slice() 方法可从已有的数组中返回选定的元素。
arrayObject.slice(start,end)
注意,该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()。
4.for…of 循环
for in 和 for of的区别是:in 是遍历对象,of是遍历值
for…of 语句创建一个循环来迭代可迭代的对象。在 ES6 中引入的 for…of 循环,以替代 for…in 和 forEach() ,并支持新的迭代协议。for…of 允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代的数据结构等。
5.es6新增语法${}
这是es6中新增的字符串方法,将字符串变量用 包 起 来 , 例 如 ‘ {}包起来,例如 ` 包起来,例如‘{prop}(${obj[prop]})`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>力扣</title>
</head>
<body>
<!--每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。给定两个列表,一个是名字及对应的频率,另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率。注意,如果 John 和 Jon 是相同的,并且 Jon 和 Johnny 相同,则 John 与 Johnny 也相同,即它们有传递和对称性。
在结果列表中,选择字典序最小的名字作为真实名字。
示例:
输入:names = ["John(15)","Jon(12)","Chris(13)","Kris(4)","Christopher(19)"],
synonyms = ["(Jon,John)","(John,Johnny)","(Chris,Kris)","(Chris,Christopher)"]
输出:["John(27)","Chris(36)"]
-->
<!--**
* @param {
string[]} names
* @param {
string[]} synonyms
* @return {
string[]}
*/-->
<script>
//并查集类
class MFS{
//constructor函数用来接收传过来的参数
constructor(arr){
this.root = {
}
arr.forEach(name=>{
this.root[name] = name//初始化root,把名字指向自身,也就是建立集合
})
}
merge (a, b) {
//a,b是建立亲戚关系的
let ar = this.find(a)
let br = this.find(b)
if(ar === br) return //字典序相同说明已经有根了
if(ar > br){
//根都是指向自己的,从字典序大的指向字典序小的,字典序最小的还是指向他自己
this.root[ar] = br
}else{
this.root[br] = ar
}
}
find(m){
//间接值相同,就要找根,找元素的根
let mr = m
while(this.root[mr]!==mr){
mr = this.root[mr]//一个有根,一个根是自己,把有根的返回根的值去和没根的连接(字典序最小的作为代表元)
}
return mr
}
}
var trulyMostPopular = function(names,synonyms){
//获取全部名字
let set = new Set()
for(let n of names){
let a = n.split('(')[0]
set.add(a)
}
for(let s of synonyms){
let a = s.split(',')[0].slice(1)
let b = s.split(',')[1].slice(0,-1)
set.add(a)
set.add(b)
}
//把类似的合并到同一集合(把有关系的连接起来)
let list = [...set];//把set数据类型放到数组里面
let mfs = new MFS(list)//让list里面有所有的名字指向自身
for(let s of synonyms){
let a = s.split(',')[0].slice(1)
let b = s.split(',')[1].slice(0,-1)
mfs.merge(a,b)//把a,b连接起来(有亲戚关系的连起来)
}
//把同类的次数合并
let obj = {
}//obj用来存放相同的类型的次数
for(let n of names){
let m = n.split('(')[0]
let name = mfs.find(m)//找到元素的根,以根为名,最小字典序
let times = +(n.split('('))[1].slice(0,-1)//把names中的数字即次数取出来
obj[name] = (obj[name]||0) + times//obj为空就是0
}
//转成数组
let res = []
for(let prop in obj){
//in取对象名
res.push(`${
prop}(${
obj[prop]})`)//字符串拼接,用``反单引号与${}配合拼接,${}包裹拼接的变量
}
return res
}
</script>
</body>
</html>