(转载)js数组去重

嵌套循环比较

两层 for 循环,for 循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比。若结果数组中没有该元素,则存到结果数组中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Array.prototype.unique_towFor =
Array.prototype.unique_towFor ||
function () {
var result = [];
if (this.length <= 0) return result;
result.push(this[0]);
for (var i = 1; i < this.length; i++) {
var notIn = true;
for (var j = 0; j < result.length; j++) {
if (this[i] == result[j]) {
notIn = false;
break;
}
}
if (notIn) {
result.push(this[i]);
}
}
return result;
};

临时数组保存

算法的基本思想就是把去重后的结果放在一个临时数组中。对原来数组的元素与临时数组元素比较,临时数组中不存在这个元素的,放入临时数组。

1
2
3
4
5
6
7
8
9
10
11
Array.prototype.unique_tempArray =
Array.prototype.unique_tempArray ||
function () {
var result = []; //临时数组
for (var i = 0; i < this.length; i++) {
if (result.indexOf(this[i]) == -1) {
result.push(this[i]);
}
}
return result;
};

利用对象去重(基础常用)

创建一个新的数组存放结果,和一个空对象。for 循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值,存入到对象中。这个方法用作统计也很方便。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Array.prototype.unique_objectArray =
Array.prototype.unique_objectArray ||
function () {
var result = [];
var obj = {};
for (var i = 0; i < this.length; i++) {
if (!obj[this[i]]) {
obj[this[i]] = 1;
result.push(this[i]);
} else {
obj[this[i]]++;
}
}
return result;
};

先排序,后去重

先把数组排序,然后比较相邻的两个值。 排序的时候用的 JS 原生的 sort 方法,JS 引擎内部用的是快速排序,此方法速度比较快!无语中。

1
2
3
4
5
6
7
8
9
10
11
12
Array.prototype.unique_sortArray =
Array.prototype.unique_sortArray ||
function () {
this.sort();
var result = [this[0]];
for (var i = 1; i < this.length; i++) {
if (this[i] !== result[result.length - 1]) {
result.push(this[i]);
}
}
return result;
};

利用 ES6 的 Set 对象和 Array.from 方法

  • Set 对象可以是任何类型的单个值的集合。它是 ES6 新增的有序列表集合,它不会包含重复项。之前我们通常用对象(Object)或者数组(Array)来实现没有重复项的集合。
  • Array.from()方法可以将一个类数组对象或可遍历对象转换成真正的数组。
1
2
3
4
5
Array.prototype.unique_es6SetArray =
Array.prototype.unique_esSetArray ||
function () {
return Array.from(new Set(this));
};

利用 filter 和 Map 对象

filter() 方法使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组。

1
2
3
4
5
6
7
Array.prototype.unique_filterArray =
Array.prototype.unique_filterArray ||
function () {
return this.filter(function (item, index, arr) {
return arr.indexOf(item) === index;
});
};

既然可以使用 filter 的方法,那么也可以使用 filterobject 的方法,这里使用 Map 对象。

1
2
3
4
5
6
7
8
Array.prototype.unique_es6MapArray =
Array.prototype.unique_es6MapArray ||
function () {
const seen = new Map();
return this.filter(function (item, index, arr) {
!seen.has(item) && seen.set(item, 1);
});
};

这里的 filter 函数可以简化,当然也有人这样写

1
2
3
4
5
6
Array.prototype.unique_es6MapArray =
Array.prototype.unique_es6MapArray ||
function () {
const seen = new Map();
return this.filter((a) => !seen.has(a) && seen.set(a, 1));
};

使用第三方

最后,可以使用第三方库函数 jqueryunderscore 或者 lodash。 下面以 lodashunderscore 为例

1
2
3
4
5
Array.prototype.unique_3partyArray =
Array.prototype.unique_3partyArray ||
function () {
return _.uniq(arr); //要先引入lodash.js或者underscore.js
};
---- 本文结束,感谢您的阅读 ----