最近前端面试遇到的的一个问题:怎样去掉Javascript的Array的重复项,并且实现排序。这个问题看起来简单,但是其实暗藏杀机。 考的不仅仅是实现这个功能,更能看出你对JS代码的深入理解。
这几天想了一些方法,可以实现这个目的。
首先实现一个排序的方法:
1 2 3
| var seq = function(x, y){ return x - y; }
|
实现数组去重并排序:
1 2 3 4 5 6 7 8 9 10 11
| Array.prototype.unique1 = function() { var n = []; for (var i = 0; i < this.length; i++) { if (n.indexOf(this[i]) == -1) { n.push(this[i]); }; }; return n.sort(seq); };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Array.prototype.unique2 = function() { var n = {}, r = []; for (var i = 0; i < this.length; i++) { if (!n[this[i]]) { n[this[i]] = true; r.push(this[i]); }; }; return r.sort(seq); };
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| Array.prototype.unique3 = function() { var n = [this[0]];
for (var i = 1; i < this.length; i++) { if (this.indexOf(this[i]) == i) { n.push(this[i]); }; }; return n.sort(seq); };
|
1 2 3 4 5 6 7 8 9 10 11 12
| Array.prototype.unique4 = function() { this.sort(seq); var n = []; for (var i = 0; i < this.length; i++) { if (this[i] != this[i - 1]) { n.push(this[i]); }; }; return n; };
|
1 2 3 4 5 6 7 8 9 10 11
| Array.prototype.unique5 = function() { return this.reduce(function(a, b){ if (a.indexOf(b) < 0 ) { a.push(b); }; return a; }, []); };
|
其中1、3、5的方法都用到了数组indexOf
方法。使用这个方法是为了寻找存入参数在数组中第一次出现的位置。显然,js引擎在调用这个方法的时候会挨个遍历数组直到找到目标为止,所以函数会花掉比较多的时间。
至于第2种的做法就是把已经出现过的字段,通过关键字的形式存入一个对象内,利用关键字索引要比indexOf
遍历数组快得多。
第4种方法的思路是先把数组排序,然后比较相邻的两个值。这种方法也比第1种和第3种方法快了不少。