数组去重(写在原型上的方法)
一、原始值
1. indexOf去重
if (!Array.prototype.unique) {
Array.prototype.unique = function () {
let arr = []
len = this.length;
for (let i = 0; i < len; i++) {
if (arr.indexOf(this[i]) === -1) {
arr.push(this[i])
}
}
return arr;
}
}
2. 哈希去重
对象属性的存储采用的时哈希算法
if (!Array.prototype.unique) {
Array.prototype.unique = function () {
let arr = [],
obj = {}
len = this.length;
for (let i = 0; i < len; i++) {
if (!obj[typeof this[i] + this[i]]) {
arr.push(this[i]);
obj[typeof this[i] + this[i]] = true;
}
}
return arr;
}
}
3. include
判断数组是否包含某个值,返回true或false
if (!Array.prototype.unique) {
Array.prototype.unique = function () {
var len = this.length;
for (let i = 0; i < len; i++) {
if (!arr.includes(this[i])) {
arr.push(this[i]);
}
}
return arr;
}
}
4. ES6 set数据结构+.../Array.from()
类数组,成员都是唯一的,没有重复的值;需将结果转换为数组
if (!Array.prototype.unique) {
Array.prototype.unique = function () {
let set=new Set(this);
return [...set];
// return Array.from(set);
}
}
set去重小知识点(数组中包含引用类型数据)
我们都知道ES6中set可以实现数组去重。
但是如果数组中的数据类型为引用类型时,是无法实现去重的。
示例代码如下:
var arrObject1=[{name:"lisa"},{name:"lisa"},{name:"jennie"},[1,2],[1,2]];
var arrObject2=[1,1,2,3,3];
var set1=new Set(arrObject1);
console.log(Array.from(set1)); // [{name:"lisa"},{name:"lisa"},{name:"jennie"},[1,2],[1,2]]
var set2=new Set(arrObject2);
console.log(Array.from(set2)); // [1,2,3]
5. ES6 map数据结构 + filter
map为键值对的集合,没有某个键,就将其设置为1
if (!Array.prototype.unique) {
Array.prototype.unique = function () {
let map=new Map();
this.filter(item=>!map.has(item)&&map.set(item,1));
}
}
6、reduce+indexOf
if (!Array.prototype.unique) {
Array.prototype.unique = function () {
let arr = this;
let result=arr.reduce((prev,cur,index,arr)=>{
prev.indexOf(cur)==-1?prev.push(cur):prev;
return prev;
},[])
return result;
}
}
二、引用值
如果一个数组中包含多个对象(只有对象),根据对象中的某一个属性进行去重
Array.prototype.unique1 = function(){
var len = this.length,
obj = {},
ret = [];
for(var i = 0; i < len; i++){
if(!obj[this[i].id]){
ret.push(this[i]);
obj[this[i].id] = true;
}
}
return ret;
}
var arr1 = [{id:"1",name:"yang"},{id:"2",name: "wang"},{id:"1",name:"li"}];
arr1.unique1();