Set()对象的方法
Set()对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
语法:
new Set([iterable]);
举例
array = [1,1,1,2,3,4,2,2,3,4,5,5] //构建一个数组array
let newSet = new Set(array) //创建一个新的Set对象,内容是{1,2,3,4,5}
let arr = [...newSet] //得到一个新的数组,arr = [1,2,3,4,5]
因为Set构造器的原因,返回的是一个对象,而不是一个数组,用展开操作符可转换成一个数组,所以完整代码可以省略中间的newSet。如下
let array = [1,1,1,2,3,4,2,2,3,4,5,5]
let array1 = [...new Set(array)]
console.log(array1) //打印出[1,2,3,4,5]
用哈希表
let hashRepeat = (numbers) =>{
let hashTable = {},result = []
for(let i=0;i<numbers.length;i++){ // 遍历数组
if(!(numbers[i] in hashTable)){ // 判断数值是否在表中
hashTable[numbers[i]] = numbers[i] // 如果没有就添加到表中
result.push(numbers[i])
}
}
return result
}
Map
Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值
Map实例的属性和操作方法:
- size:返回Map的对象键/值对的数量
- set(key, value):设置Map对象中的键值,返回该Map对象
- get(key):返回键对应的值,如果不存在,则返回undefined。
- has(key):返回一个布尔值,表示Map实例是否包含键对应的值。
- delete(key):如果 Map 对象中存在该元素,则移除它并返回 true;否则如果该元素不存在则返回 false。随后调用 Map.prototype.has(key) 将返回 false 。
- clear():移除Map对象的所有键/值对
Map实例的遍历方法:
- keys():返回一个新的 Iterator对象, 它按插入顺序包含了Map对象中每个元素的键 。
- values():返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的值 。
- entries():返回一个新的 Iterator 对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。
- forEach():按插入顺序,为 Map对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg,它将在每次回调中作为this值。
let mapRepeat = (numbers) {
let hashMap = new Map(); //构建一个Map对象,
let result = []; // 构建一个数组,最为返回值
for (let i = 0; i < numbers.length; i++) {
if(hashMap.has(numbers[i])) { // 判断 hashMap 中是否已有该 key 值
hashMap.set(numbers[i], true); // 如果有,表示重复,value值就是true
} else { // 如果 hashMap 中没有该 key 值,
hashMap.set(numbers[i], false); //添加到hashMap中,value值就是false
result.push(numbers[i]); //将未重复的值添加到创建的数组中去
}
}
return result;
}
for循环
let repeat = (numbers) =>{
for (let i = 0 ;i<numbers.length;i++){ //第一次遍历数组
let x = numbers[i]
for(let j = i+1;j<numbers.length;){
if(x === numbers[j]){
numbers.splice(j,1)
}else{j++} // 只有不相等后才能j++
}
}
return numbers
}
总结
用Set()对象的方法,由于是自带的api我们不需要去做多于的操作,方便快捷
表格的方法理解起来并不难,由于只遍历一边数组,所以时间复杂度上为O(n) 而且表格可以对每一个重复的值做标记,方便以后查询使用。
普通的for循环,由于遍历两次数组,所以时间复杂度是O(n^2),而且for循环使用splice会改变原数组。