@frank-shaw
2020-03-09T14:11:38.000000Z
字数 1188
阅读 868
javaScript
数组去重可是个经常出现的面试题。常见的类型是这样的:
有数组 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],请用 JavaScript 实现去重函数 unqiue,使得 unique(arr) 返回 ['a', 'b', 'c', '1', 0, 1, '']
作为面试题,需要明白它的考点:
1.正确。需要在各式各样的浏览器中保证函数的正确性,其实并不是一个很简单的事情。
2.性能。虽然大部分情况下 JavaScript 语言本身(狭义范畴,不包含 DOM 等延拓)不会导致性能问题,但很不幸这是一道考题,因此面试官们还是会把性能作为一个考点。
一个常见的直觉做法可以通过 数组的indexOf 属性来辅助:
function unique(arr){
var result = [];
for(var i = 0, length = arr.length; i< length; i++){
if(result.indexOf(arr[i]) == -1){
result.push(arr[i]);
}
}
return result;
}
可惜的一个点就是:在 IE6-8 下,数组的 indexOf 方法还不存在。直觉方案要稍微改造一下:
var indexof = [].indexOf
? function(arr, value){
return arr.indexOf(value);
}
: function(arr, value) {
for(var i = 0, length = arr.length; i< length; i++){
if(arr[i]) === value){
return i;
}
}
return -1;
}
function unique(arr){
var result = [];
for(var i = 0; i< arr.length; i++){
if(indexof(result, arr[i]) == -1){
result.push(arr[i]);
}
}
return result;
}
上面的实现,竟然需要两层循环。这怎么可以接受呢?我们必须考虑另一种方案来加快这个查询的速度。使用{}
来模拟hash表吧:
在这里,使用typeof item + JSON.stringify(item)
作为hash的key值,
var array = [{value: 1}, {value: 1}, {value: 2}];
function unique(arr) {
var ret = []
var hash = {}
for (var i = 0; i < arr.length; i++) {
var item = arr[i]
var key = typeof(item) + JSON.stringify(item)
if (hash[key] !== 1) {
ret.push(item)
hash[key] = 1
}
}
return ret
}
这个方案不错。如果是在ES6 中,那么必然会更加简单,只需要使用新的 Set 内置类即可。