三种要领
应用indexOf推断新数组
-
underscore.js
中实际上也是运用的相似的indexOf
//传入数组
function unique1(arr){
var tmpArr = [];
for(var i=0; i<arr.length; i++){
//假如当前数组的第i已保留进了暂时数组,那末跳过,
//不然把当前项push到暂时数组内里
if(tmpArr.indexOf(arr[i]) == -1){
tmpArr.push(arr[i]);
}
}
return tmpArr;
}
应用indexOf推断旧数组
function unique2(arr){
var tmpArr = []; //效果数组
for(var i=0; i<arr.length; i++){
//假如当前数组的第i项在当前数组中第一次涌现的位置不是i,
//那末示意第i项是反复的,疏忽掉。不然存入效果数组
if(arr.indexOf(arr[i]) == i){
tmpArr.push(arr[i]);
}
}
return tmpArr;
}
应用hash查找
function unique3(arr){
var tmpArr = [], hash = {};//hash为hash表
for(var i=0;i<arr.length;i++){
if(!hash[arr[i]]){//假如hash表中没有当前项
hash[arr[i]] = true;//存入hash表
tmpArr.push(arr[i]);//存入暂时数组
}
}
return tmpArr;
}
数组扩大
Array.prototype.unique1 = function (){
var tmpArr = [];
for (var i = 0; i < this.length; i++){
if (tmpArr.indexOf(this[i]) == -1){
tmpArr.push(this[i]);
}
}
return tmpArr;
}
Array.prototype.unique2 = function(){
var tmpArr = []; //效果数组
for(var i = 0; i < this.length; i++){
if (this.indexOf(this[i]) == i){
tmpArr.push(this[i]);
}
}
return tmpArr;
}
Array.prototype.unique3 = function(){
var tmpArr=[], hash = {};
for(var i = 0; i < this.length; i++){
if (!hash[this[i]]){
hash[this[i]] = true;
tmpArr.push(this[i]);
}
}
return tmpArr;
}
运用Set
-
Set
和Map
是ES6中新增的数据结构 -
Set
直接能够存储不反复的一组key
,这个key
也能够是对象,字符串等
建立set
var s = new Set([1, 2, 3,]);
s; // Set {1, 2, 3}
新增元素
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}//反复元素不会被增加
删除元素
s; // Set {1, 2, 3, 4}
s.delete(3);
s; // Set {1, 2, 4}
遍历元素
-
Map
和Set
没法运用下标 - ES6规范引入了新的
iterable
范例,Array
、Map
和Set
都属于iterable
范例
var s = new Set(['A', 'B', 'C']);
for (var x of s) { // 遍历Set
alert(x);
}
- 或许直接运用
iterable
内置的forEach
要领 -
forEach
要领是ES5.1
规范引入的
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, set) {
alert(element);
});
参考文章