资讯专栏INFORMATION COLUMN

js基本操作-数组去重

blastz / 3366人阅读

摘要:基本操作数组去重写在前面数组去重经常出现在前端招聘的笔试题里,比如有数组,请用实现去重函数,使得返回作为笔试题,考点有二正确。基本介绍文章主要是对数组去重的常用方法进行介绍。

js基本操作-数组去重 写在前面

JavaScript 数组去重经常出现在前端招聘的笔试题里,比如:

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

作为笔试题,考点有二:

正确。别小看这个考点,考虑到 JavaScript 经常要在浏览器上运行,在千姿百态的各种浏览器环境下要保障一个函数的正确性可不是一件简单的事,不信你继续读完这篇博客。

性能。虽然大部分情况下JavaScript语言本身(狭义范畴,不包含DOM等延拓)不会导致性能问题,但很不幸这是一道考题,因此面试官们还是会把性能作为一个考点。

所有的方法都来自网上,学到了才是自己的!!
然后,写在前面,带上我们可爱的小伙伴。

基本介绍

文章主要是对js数组去重的常用方法进行介绍。JS去重,看起来简单,但是其实暗藏许多的小窍门。考的不仅仅是实现这个功能,更能看出你对计算机程序执行的深入理解。下面将从数组去重的方法进行详细的了解。

数组去重的方法 1.嵌套循环比较

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

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;
}
2.临时数组保存

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

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;
}
3.利用对象去重(基础常用)

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

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;
}
4.先排序,后去重

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

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;
}
5.利用ES6的Set对象和Array.from方法

[ ] Set对象可以是任何类型的单个值的集合。它是ES6新增的有序列表集合,它不会包含重复项。之前我们通常用对象(Object)或者数组(Array)来实现没有重复项的集合。

[ ] Array.from()方法可以将一个类数组对象或可遍历对象转换成真正的数组。

Array.prototype.unique_es6SetArray = Array.prototype.unique_esSetArray || function(){
    return Array.from(new Set(this));
}
6.利用filter和Map对象

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

Array.prototype.unique_filterArray = Array.prototype.unique_filterArray || function(){
    return this.filter(function(item, index, arr){
        return arr.indexOf(item) === index;
    });
}

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

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函数可以简化,当然也有人这样写

Array.prototype.unique_es6MapArray = Array.prototype.unique_es6MapArray || function(){
    const seen = new Map();
    return this.filter(
        (a) => !seen.has(a) && seen.set(a, 1)
    );
}
7.使用第三方

最后,可以使用第三方库函数jquery和underscore或者lodash
下面以lodash和underscore为例

Array.prototype.unique_3partyArray = Array.prototype.unique_3partyArray || function(){
    return _.uniq(arr);//要先引入lodash.js或者underscore.js
}
其他说明

以上的所有方法,都来自网上。

所有的方法,都必须脚踏实地,在具体应用场景下去分析、去选择,我们应该按照具体的情况,来选择方法。

因为浏览器的多样性,前端的应用场景经常很复杂,性能优化充满挑战,也充满机遇。

学会了才是自己的,知道会用会写,才是我们最终的目标。

方法中,建议参考underscore.js的源代码的方法。以下是underscore.js中uniq的源码。

// Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // Aliased as `unique`.
  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
    if (!_.isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!_.contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!_.contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  };

文档说明如下:

uniq_.uniq(array, [isSorted], [iteratee]) Alias: unique

Produces a duplicate-free version of the array, using === to test object equality. In particular only the first occurence of each value is kept. If you know in advance that the array is sorted, passing true for isSorted will run a much faster algorithm. If you want to compute unique items based on a transformation, pass an iteratee function.

_.uniq([1, 2, 1, 4, 1, 3]);

=> [1, 2, 4, 3]

本文仅只用于学习、研究和交流目的,我也是学习过后慢慢总结过来的,如果有什么错误或者好的建议,欢迎大家批评指正!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91669.html

相关文章

  • js基本操作-数组去重

    摘要:基本操作数组去重数组去重的方法临时数组保存其实这里面还没考虑到数组里面嵌套数组对象的情况把去重后的结果放在一个临时数组中对原来数组的元素与临时数组元素比较临时数组中不存在这个元素的放入临时数组。 js基本操作-数组去重 数组去重的方法 1. 临时数组保存(其实这里面还没考虑到数组里面嵌套数组/对象的情况) 把去重后的结果放在一个临时数组中, 对原来数组的元素与临时数组元素比较, 临时...

    GeekGhc 评论0 收藏0
  • JS数组去重方法小结

    摘要:数组去重看了网上很多数组去重方法,用的比较常见的大概就几种,今天想自己来做一个总结。还有就是方法返回的数组也是排序后的数组,某些情况下可能不符合要求。 JS数组去重 看了网上很多数组去重方法,用的比较常见的大概就几种,今天想自己来做一个总结。部分内容参考该博客 1 . 在原数组上操作(基本方法) 思路:利用循环嵌套,判断数组中每个元素与其后面的元素是否相等,如果相等,就使用spli...

    PascalXie 评论0 收藏0
  • js扩展运算符,神奇的3个点点,数组去重、合并数组等等

    最近lz一周排了9个面试,面试经常被问到一些数组的问题,比如说es6里面一些数组去重、合并数组,之前压根就没了解过,后来才知道考的都是es6的知识,今天好好挖掘一下,发现一个神奇的点点三姐妹 我们来看看经常使用的方法 1、数组去重 之前的想法可能要遍历数组去重,但是现在又es6的骚操作 var a = [1,1,2,3] Array.from(new Set()) // 利用es6...

    waltr 评论0 收藏0
  • js数组去重

    数组去重的方式有很多种,现总结一些备以后查漏补缺来用。 对基本数组类型去重: (1)set 和 array.from()实现 var str, strs = [a, b, c, er, d, er, a, b, c]; function removeRepeat(arr) { return Array.from(new Set(arr)) } console.log(remove...

    cartoon 评论0 收藏0
  • JavaScript 实现数组更多的高阶函数

    摘要:实现数组更多的高阶函数吾辈的博客原文场景虽说人人平等,但有些人更加平等。若是有一篇适合萌新阅读的自己实现数组更多操作的文章,情况或许会发生一些变化。类似于的初始值,但它是一个函数,避免初始值在所有分组中进行累加。 JavaScript 实现数组更多的高阶函数 吾辈的博客原文: https://blog.rxliuli.com/p/fc... 场景 虽说人人平等,但有些人更加平等。 为...

    aervon 评论0 收藏0

发表评论

0条评论

blastz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<