[关闭]
@frank-shaw 2020-03-09T14:11:38.000000Z 字数 1188 阅读 868

JS 数组去重与性能优化

javaScript


数组去重可是个经常出现的面试题。常见的类型是这样的:

有数组 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],请用 JavaScript 实现去重函数 unqiue,使得 unique(arr) 返回 ['a', 'b', 'c', '1', 0, 1, '']

作为面试题,需要明白它的考点:

常见的做法

一个常见的直觉做法可以通过 数组的indexOf 属性来辅助:

  1. function unique(arr){
  2. var result = [];
  3. for(var i = 0, length = arr.length; i< length; i++){
  4. if(result.indexOf(arr[i]) == -1){
  5. result.push(arr[i]);
  6. }
  7. }
  8. return result;
  9. }

可惜的一个点就是:在 IE6-8 下,数组的 indexOf 方法还不存在。直觉方案要稍微改造一下:

  1. var indexof = [].indexOf
  2. ? function(arr, value){
  3. return arr.indexOf(value);
  4. }
  5. : function(arr, value) {
  6. for(var i = 0, length = arr.length; i< length; i++){
  7. if(arr[i]) === value){
  8. return i;
  9. }
  10. }
  11. return -1;
  12. }
  13. function unique(arr){
  14. var result = [];
  15. for(var i = 0; i< arr.length; i++){
  16. if(indexof(result, arr[i]) == -1){
  17. result.push(arr[i]);
  18. }
  19. }
  20. return result;
  21. }

优化方案

上面的实现,竟然需要两层循环。这怎么可以接受呢?我们必须考虑另一种方案来加快这个查询的速度。使用{}来模拟hash表吧:

在这里,使用typeof item + JSON.stringify(item)作为hash的key值,

  1. var array = [{value: 1}, {value: 1}, {value: 2}];
  2. function unique(arr) {
  3. var ret = []
  4. var hash = {}
  5. for (var i = 0; i < arr.length; i++) {
  6. var item = arr[i]
  7. var key = typeof(item) + JSON.stringify(item)
  8. if (hash[key] !== 1) {
  9. ret.push(item)
  10. hash[key] = 1
  11. }
  12. }
  13. return ret
  14. }

这个方案不错。如果是在ES6 中,那么必然会更加简单,只需要使用新的 Set 内置类即可。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注