弁言
数组去重是前端口试的一个必备题目,其详细表现内容为:如何去掉Javascript的Array的反复项。题目简朴直接,我们也空话不多说,直入主题吧。
平常姿态
运用数组的indexOf()
要领能够很简朴的到达目的。
Array.prototype.unique = function() {
// 建立一个新的暂时数组,用于保留输出效果
var n = [];
// 遍历当前数组
for (var i = 0; i < this.length; i++) {
// 假如当前数组的第i个元素已保留进了暂时数组,那末跳过,不然把当前项push到暂时数组内里
if (n.indexOf(this[i]) == -1) n.push(this[i]);
}
return n;
}
再列出一个变更一点的体式格局。
Array.prototype.unique = function() {
// 建立一个新的暂时数组,而且把当前数组的第一元素存入到数组中
var n = [this[0]];
// 从第二项最先遍历
for (var i = 1; i < this.length; i++)
{
// 假如当前数组的第i项在当前数组中第一次涌现的位置不是i,那末示意第i项是反复的,疏忽掉,不然存入效果数组
if (this.indexOf(this[i]) == i) n.push(this[i]);
}
return n;
}
JS引擎在完成indexOf()
的时刻会遍历数组直到找到目的为止,此函数会糟蹋掉许多时候。一切这两种体式格局都不是最优的处理体式格局。
// 另一个简约粗犷的要领
Array.prototype.unique = function() {
return this.filter((v, i) => this.indexOf(v) === i)
}
谢谢oxyflour童鞋供应的简朴粗犷的平常姿态ES6改良版,文雅而简约 :)
最快姿态
把已涌现过的元素经由过程下标的情势存入一个Object内。下标的援用的完成道理应用的是哈希算法,要比用indexOf()
搜刮数组快的多。
Array.prototype.unique = function() {
// n为hash表,r为暂时数组
var n = {}, r = [];
for (var i = 0; i < this.length; i++) {
// 假如hash表中没有当前项
if (!n[this[i]]) {
// 存入hash表
n[this[i]] = true;
// 把当前数组确当前项push到暂时数组内里
r.push(this[i]);
}
}
return r;
}
但从耗时的角度来讲,这是最优的一种处理体式格局。然则从内存占用角度来讲,这并非最优的,由于多了一个hash表。这就是所谓的空间换时候(人间安得双全法?)。
中庸姿态
Array.prototype.unique = function() {
this.sort();
var re = [this[0]];
for (var i = 1; i < this.length; i++) {
if (this[i] !== re[re.length - 1]) {
re.push(this[i]);
}
}
return re;
}
这个要领的思绪是先把数组排序,然后比较相邻的两个值。排序的时刻用的JS原生的sort()
要领,JS引擎内部应该是用的疾速排序吧。这类体式格局比运用indexOf()
的平常姿态要快,比运用hash表的最快姿态要慢,然则占用内存要少。所以这算是逆来顺受的一种中庸姿态。详细要用什么姿态,列位看官视情况而定吧。
改编自刘春龙博客中的文章《JS中数组去重题目》